题目:请你仅使用两个队列实现一个后入先出(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();
}
};