题目:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
分析:如果我们像上一篇文章用栈实现队列那样使用两个队列,一个输入队列,一个输出队列是行不通的,因为从输入栈导入输出栈,元素的进出顺序仍然没有改变。所以我们可以考虑将队列1的除最后一个元素外的所有元素先暂放入队列2,然后把最后进入的元素输出,再把队列2中暂存的元素放回队列1,从而实现后进先出。如果想要得到栈顶元素,我们可以直接输出队列1.back()。
此外我们用一个队列也可以实现栈,只需要在弹出元素时将除最后一个元素外的其他元素均移动到队尾。
具体代码1:
class MyStack {
public:queue<int> que1;queue<int> que2;MyStack() {}void push(int x) {que1.push(x);}int pop() {while(que1.size() > 1){que2.push(que1.front());//队列没有top()接口que1.pop();}int result = que1.front();que1.pop();while(!que2.empty()) {que1.push(que2.front());que2.pop();}return result;}int top() {int res = this->pop();que1.push(res);return res;//或者直接使用return que1.back();}bool empty() {return que1.empty();}
};
具体代码2:
class MyStack {
public:queue<int> que;MyStack() {}void push(int x) {que.push(x);}int pop() {int n = que.size();n--;while(n--) {que.push(que.front());que.pop();}int result = que.front();que.pop();return result;}int top() {return que.back();}bool empty() {return que.empty();}
};