剑指offer: 面试7——用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
栈1用来存放队列顺序的逆序,因此如果栈1不空2空则直接添加即可,输出时候倒过来自然是正常队列顺序,如果栈2不空,说明栈2中存的数可能是队列的正序,因此需要先借助栈1将顺序调成逆序再添加,且在此之前的栈1如果为空要顺带释放,防止内存泄漏。
添加时,分为几种情况
1)当两个栈都为空,直接在1中添加
2)1不空,2空,直接在1中添加
3)2不空1空,释放1,然后2添加到1,在1中添加节点
删除时类似,同时要判断两个栈是否为空,如果为空则错误
删除不同于添加,要从队头删,因此需要先将栈1中存放的队列逆序在2中变为正序,之后再在2栈顶删节点。
删除:
1)1不空2空,把1添加到2中,删除2栈顶
2)2不空,1空,直接删2栈顶
3)两个都不空,先删除2所有节点,把1赋到2中,再删除2栈顶
class Solution
{
public:
void push(int node) {
if(stack2.empty())
stack1.push(node);
else
{
while (!stack1.empty())
stack1.pop();
while(!stack2.empty())
{
int n=stack2.top();
stack2.pop();
stack1.push(n);
}
stack1.push(node);
}
}
int pop() {
if(stack1.empty()&&stack2.empty())return -1;
if(!stack2.empty())
{
while(!stack1.empty())
stack1.pop();
}
else
{
while(!stack1.empty())
{
int i=stack1.top();
stack1.pop();
stack2.push(i);
}
}
int j=stack2.top();
stack2.pop();
return j;
}
private:
stack<int> stack1;
stack<int> stack2;
};