[E思维] lc225. 用队列实现栈(模拟题+思维+常见)
1. 题目来源
链接:225. 用队列实现栈
2. 题目解析
常见问题,栈实现队列,队列实现栈。但是个人感觉,队列实现栈要稍微难一点点。这两个问题,实际上都是考思路,因为实现效率都得是 O ( n ) O(n) O(n),没有实际的应用意义。
两个队列,再怎么倒来倒去,会发现数据的顺序是不会发生改变的,这点和栈是有区别的。所以思路会稍微难一点点。
思路一:两个队列实现
- q1,q2。q1 用来存储当前的元素,q2 作为辅助队列。
- 当新来一个元素时,往 q2 添加,然后再将 q1 的元素依次出队加到 q2 中,再交换一下 q1、q2 内的元素就行,相当于再把 q2 的所有元素再加到 q1 中去。
- 例如:1,2,3。
- 第一次,就是把 1 添加到 q1。
- 第二次,2 先加到 q2,然后把 q1 中的 1 加到 q2,这样子,2 将先出队,1 将后出队,达到了栈的效果。
- 第三次,3 先加到 q2,然后把 q1 中的 2、1 加到 q2,这样子,3 将先出队,2、1 将后出队,达到了栈的效果。
这个思路下,代码很简洁,用了 swap 优化了代码结构,但是效率依旧是 O ( n ) O(n) O(n)
思路二:一个队列实现
- 这个思路比较直接,就是环形队列的思想
- 每次新元素来之前,先统计队列中目前有多少元素,再将新元素先加到队尾,然后将前面的所有元素依次出队再入队,就行。
- 例如:1,2,3
- 第一次,将 1 加入队列。
- 第二次,将 2 加入队列队尾,提前计算了队列中元素个数是 1 个,然后将 1 出队再入队,就变成了 2、1,已经符合了栈中的元素规则。
- 第三次,将 3 加入到队列队尾,提前计算了队列中元素个数是 2个,然后将 2、1 出队再入队,就变成了 3 2 1,符合栈中的元素规则。
这个思路下,代码也很简洁,效率是 O ( n ) O(n) O(n)
在本问题下,没有 O ( 1 ) O(1) O(1) 做法,有时候会使劲往这方面去想,hh
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
思路一:
class MyStack {
public:
queue<int> q1, q2;
MyStack() {
}
void push(int x) {
q2.push(x);
while (q1.size()) {
int x = q1.front(); q2.push(x); q1.pop();
}
swap(q1, q2);
}
int pop() {
int x = q1.front(); q1.pop();
return x;
}
int top() {
return q1.front();
}
bool empty() {
return !q1.size();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
思路二:
class MyStack {
public:
queue<int> q;
MyStack() {
}
void push(int x) {
int n = q.size();q.push(x);
for (int i = 0; i < n; i ++) q.push(q.front()), q.pop();
}
int pop() {
int x = q.front(); q.pop();
return x;
}
int top() {
return q.front();
}
bool empty() {
return !q.size();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
原文地址:https://blog.csdn.net/yl_puyu/article/details/136474496
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!