栈与队列
- 栈(stack):先进后出;队列(queue):先进先出
- 栈和队列是STL里面的两个数据结构
- 栈不能遍历元素,提供
pop
和push
等接口,时间复杂度都为O(1)
- 在SGI STL中,如果没有指定底层实现的话,栈和队列默认底层使用的是
deque
容器
232 用栈实现队列
题目链接:用栈实现队列
思路
首先根据提示代码可以确定:队列只有四个操作:push、pop、peek、empty
。针对push
操作:队列push
依次,栈也push
一次。针对pop
操作:队列pop
一次,pop
的是第一个元素;栈pop
一次,pop
的是最后面的一个元素,因此行为逻辑不统一,需要将栈中元素翻转,翻转后再pop
,就和队列pop
的元素一样。针对peek
操作:队列peek
操作,返回的是队首元素,栈何队列相反,因此也要将栈中的元素翻转。针对empty
判空操作:只有当两个栈中都没有元素时,队列中才没有元素。
class MyQueue {
public:MyQueue() {}void push(int x) {stackIn.push(x);}int pop() {if(stackOut.empty()){while(!stackIn.empty()){stackOut.push(stackIn.top());stackIn.pop();}}int result = stackOut.top();stackOut.pop();return result;}int peek() {int result = this->pop();stackOut.push(result);return result;}bool empty() {if(stackIn.empty() && stackOut.empty()){return true;}return false;}
private:stack<int> stackIn;stack<int> stackOut;
};
225 用队列实现栈
题目链接:用队列实现栈
思路
本题目和上一题目还是有一些区别的。因为队列总是先进先出,你无法翻转队列中的元素。所以当栈进行pop
操作时,将队列中前面的元素都添加到另一个队列中,然后pop
出最后一个元素。
class MyStack {
public:MyStack() {}void push(int x) {queue1.push(x);}int pop() {int size = queue1.size()-1;while(size--){queue2.push(queue1.front());queue1.pop();}int result = queue1.front();queue1.pop();queue1 = queue2;while(!queue2.empty()){queue2.pop();}return result;}int top() {int result = this->pop();queue1.push(result);return result;}bool empty() {if(queue1.empty()){return true;}return false;}
private:queue<int> queue1;queue<int> queue2;
};
参考链接:
- https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE