重点在于栈是先进后出,队列是先进先出的。要是pop()和peek()操作对象是最先进的那个元素,就得改变栈里面元素的顺序,简单来说就是逆序,自然想到两个栈倒腾:
入队 - O(1)
出队 - 摊还复杂度 O(1)
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
in_stk.push(x);
}
int pop() {
int a;
if(out_stk.empty()){
while(!in_stk.empty()){
out_stk.push(in_stk.top());
in_stk.pop();
}
a = out_stk.top();
out_stk.pop();
}else{
a = out_stk.top();
out_stk.pop();
}
return a;
}
int peek() {
if(out_stk.empty()){
while(!in_stk.empty()){
out_stk.push(in_stk.top());
in_stk.pop();
}
}
return out_stk.top();
}
bool empty() {
return in_stk.empty() && out_stk.empty();
}
private:
stack<int> in_stk;
stack<int> out_stk;
};
换个写法:
入队 - O(n)
出队 - O(1)
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
while(!in_stk.empty()){
out_stk.push(in_stk.top());
in_stk.pop();
}
out_stk.push(x);
while(!out_stk.empty()){
in_stk.push(out_stk.top());
out_stk.pop();
}
}
int pop() {
int a = in_stk.top();
in_stk.pop();
return a;
}
int peek() {
return in_stk.top();
}
bool empty() {
return in_stk.empty();
}
private:
stack<int> in_stk;
stack<int> out_stk;
};