请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []]
输出: [null, null, null, 1, 1, false]
解题思路:思路灰常简单,创建两个栈一个输出栈(pushst),另一个是输入栈(popst)来实现队列的输入,输出。将进栈的数据,放到pushst中,进行删除操作时,将pushst中的数据全部放入到popst中,获取第一个元素,然后删除它,后面按照这个思路一直进行即可
返回队列开头元素,如果popst中还有剩余元素,直接返回栈顶元素即可,若没有就将pushst中的元素放入到popst中再出栈顶元素
队列判空,如果pushst或者popst中有元素,则返回false,都没有元素则返回true
代码实现:
class MyQueue {void transmit(){while(!_pushst.empty()){_popst.push(_pushst.top());_pushst.pop();} }
public:MyQueue() {}void push(int x) {_pushst.push(x);}int pop() {if(_popst.empty()){transmit();}int front = _popst.top();_popst.pop();return front;}int peek() {if(_popst.empty()){transmit();}return _popst.top();}bool empty() {return _pushst.empty() && _popst.empty();}stack<int> _pushst, _popst;
};