剑指offer—用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的push和pop操作。 队列中的元素为int类型。
思路1
一个栈为主栈,弹出顺序就是进队的顺序;一个栈为副栈,在push操作时候做辅助作用
push操作:先将主栈里的数一个一个拿出来放入副栈里面,再将要插入的值push进副栈,这时候副栈从栈底往上的顺序就是入队顺序,最后只需要把副栈的数再移到主栈就可以了。
pop操作:若主栈有值则弹出
代码实现
public:
void push(int node) {
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
stack2.push(node);
while(!stack2.empty())
{
stack1.push(stack2.top());
stack2.pop();
}
}
int pop() {
int res = stack1.top();
stack1.pop();
return res;
}
private:
//主栈
stack<int> stack1;
//副栈
stack<int> stack2;
};
思路2
在思路1中连续插入的时候就发现每次都移动两次栈,我们试想一下可以先把副栈的值保留,当下一次操作还是push的时候,就可以继续在副栈里添加,然后pop的时候再把副栈移到主栈,弹出最上面的数就可以了。
代码实现
public:
void push(int node) {
//如果主栈不为空,则上一次操作不是push,将主栈移到副栈,再push值
//连续两次push操作的话,第二次push的时候主栈为空,直接push值进副栈
if(!stack1.empty())
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
stack2.push(node);
}
int pop() {
//若副栈不为空,则上一次操作不是pop,将副栈移到主栈,再pop值
//连续两次pop操作的话,第二次pop的时候副栈一定是空的,所以直接pop主栈
while(!stack2.empty())
{
stack1.push(stack2.top());
stack2.pop();
}
int res = stack1.top();
stack1.pop();
return res;
}
private:
//主栈
stack<int> stack1;
//副栈
stack<int> stack2;
};