本文已参与「新人创作礼」活动,一起开启掘金创作之路。
232. 用栈实现队列 和 225. 用队列实现栈
1. 总体思路:
- 1.用栈模拟队列,使用两个栈,不断倒腾。
- 2.用队列模拟栈,使用两个队列,其中一个是备份。
2. 用栈实现队列:
- 1.push:直接压入栈A
- 2.pop:如果栈B为空,把栈A中的所有元素pop然后push到栈B。然后栈B pop。
- 3.peek:复用pop,但是不能删除这个元素,要再加到栈里
- 4.empty:如果栈A和栈B都为空则true
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
if(stOut.empty()){
while(!stIn.empty()){
stOut.push(stIn.top());
stIn.pop();
}
}
int res = stOut.top();
stOut.pop();
return res;
}
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {
return (stIn.empty() && stOut.empty());
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
2. 用队列实现栈:
- 1.push:直接压入队列A
- 2.pop:将队列A中的元素转移到队列B中,最后一个除外,然后返回最后一个元素,清空队列A,再把队列B中的元素放到队列A中,再清空队列B
- 3.top:调用队列A.back接口
- 4.empty:如果队列A空则true
- 5.从以上可以看出队列B就是一个备份临时存放的作用
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--){
que2.push(que1.front());
que1.pop();
}
int res = que1.front();
que1.pop();
que1 = que2;
while(!que2.empty()){
que2.pop();
}
return res;
}
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();
*/