请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例 1:
输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 1, 1, false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false
提示:
1 <= x <= 9
- 最多调用
100
次push
、pop
、peek
和empty
- 假设所有操作都是有效的 (例如,一个空的队列不会调用
pop
或者peek
操作
C++基础知识:
stack的使用
1.初始化:stack <int> stack1,stack2
2.stack.push()//入栈,top++,无返回值
stack.pop()//出栈,top--,无返回值
stack.top()//弹出栈顶元素,返回栈顶元素
stack.empty()//判断栈是否为空,为空则return true
class MyQueue { private: stack <int> instack,outstack; public: MyQueue() { } void push(int x) { instack.push(x); } int pop() { /* 加上outstack是否为空的判断,两种情况,情况一:outstack不为空,则继续输出 2 3 4,outstack保持原来顺序输出,之后新的入栈的5此时呆在instack, outstack全部出栈后再pop。 情况二:outstack为空则正常从instack插入到outstack。 未加判断,首次入栈出栈正常,第二次入栈出栈顺序有问题。输出为1 5 2 3 4,正确为1 2 3 4 5(2,3,4保持outstack第一次push的顺序,5留在instack不动) while(!instack.empty()) { outstack.push(instack.top()); instack.pop(); } int ans=outstack.top(); outstack.pop(); return ans; }*/ //加上outstack是否为空栈的判断 if(outstack.empty()) { while(!instack.empty())//为空则将instack全部入out栈,然后正常输出 { outstack.push(instack.top()); instack.pop(); } } int ans=outstack.top();//为空or不为空outstack都是正常出栈输出 outstack.pop(); return ans; } //wrong:["MyQueue","push","push","peek","push","peek"] [[],[1],[2],[],[3],[]] /* 输出:[null,null,null,1,null,3] 正确结果:[null,null,null,1,null,1] 错误原因同上:outstack不为空时插入,栈顶元素不应该改变,此时应该暂存再在instack,outstack为空时再插入返回栈顶元素。 int peek() { while(!instack.empty()) //outstack为空的情形 { outstack.push(instack.top()); instack.pop(); } return outstack.top(); }*/ int peek() { if(outstack.empty()) { while(!instack.empty()) {outstack.push(instack.top()); instack.pop();} } return outstack.top();//不为空的话因为未入outstack栈因此直接return 栈顶元素就行 } bool empty() { return instack.empty()&&outstack.empty(); } };