一、用栈实现队列
232.用栈实现队列
使用两个栈来模拟即可
关键在于:出栈的时候,一旦有出栈的行为,(前提是out栈里要有数据啊,没有出个毛线的栈)就要把in里面的所有元素,全部弄到out栈里面。这样的话,咱们出栈的顺序才是队列的顺序。
class MyQueue {
private:
stack<int> in;
stack<int> out;
public:
MyQueue() {
}
// 直接入到in里面
void push(int x) {
in.push(x);
}
// 关键在于出栈
int pop()
{
// 只有out栈为空,再从in栈里把数据全部持续输出到out里
if(out.empty())
{
while(!in.empty())
{
out.push(in.top());
in.pop();
}
}
int res=out.top();
out.pop();
return res;
}
int peek() {
// 还是要从out栈里面去找这个元素
// 复用pop(),但是pop取得了它队列首部这个元素,也把它给弹出来了,所以要把它加回去
int res = this->pop();
out.push(res);
return res;
}
bool empty() {
return in.empty()&&out.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();
*/
二、用队列实现栈
225. 用队列实现栈
大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
关键在于pop的时候;如何处理?
class MyStack {
private:
queue<int> q;
public:
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size=q.size();
size--;
while(size--)
{
q.push(q.front());
q.pop();
}
int res=q.front();
q.pop();
return res;
}
int top() {
return q.back();//栈顶元素,相当于队尾元素
}
bool empty() {
return q.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();
*/
1、你怎么知道pop掉3的时候,要把1和2给重新加入队列呢?
把size-1个元素弹出来,重新加到队列中即可。