本题是关于使用队列来实现栈的基础操作:push,pop,top和empty。关键点在于理清在pop元素时,主要队列将元素导入到辅助队列或者重新添加到队列尾部来模拟栈的过程。
双队列思路:
- push函数将元素x直接压入que1。
- pop函数首先获取队列que1的大小,然后依次将队列que1的元素导入队列que2中,但是要留下最后一个元素作为返回值。接着将队列que2赋值给队列que1,并清空队列que2。最后返回留下的元素即可。
- top函数直接返回队列que1的末尾元素,即栈的最顶上的元素。
- empty函数直接返回队列que1是否为空即可。
双队列代码:
class MyStack {
public:
queue<int> que1;
queue<int> que2;
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
size--;
while (size--) { // 将que1 导入que2,但要留下最后一个元素
que2.push(que1.front());
que1.pop();
}
int result = que1.front(); // 留下的最后一个元素就是要返回的值
que1.pop();
que1 = que2; // 再将que2赋值给que1
while (!que2.empty()) { // 清空que2
que2.pop();
}
return result;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
单队列思路:
- push函数将元素x直接压入que。
- pop函数首先获取队列que的大小,然后依次将队列que的元素重新添加到队列尾部,但是要留下最后一个元素作为返回值返回。
- top函数直接返回队列que的末尾元素,即栈的最顶上的元素。
- empty函数直接返回队列que是否为空即可。
单队列代码:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;
while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
que.push(que.front());
que.pop();
}
int result = que.front(); // 留下的最后一个元素就是要返回的值
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/