题目描述:用两个栈实现一个队列,分别完成在队列尾部插入整数和在队头删除整数的功能。(若队列中没有元素,删除函数返回-1)
解题思路:众所周知,栈的基本特点是先入后出,队列的基本特点是先入先出。那么两个栈所需要完成的任务就是一个先入,一个先出,那么如何实现这个功能呢?我们将栈1功能定为入队,栈2功能定为出队,此时要让先入栈1的先出,我们可以把栈1的所有元素都入到栈2中(顺序反过来),再将栈2的第一个元素出栈(相当于栈1的栈顶元素==队列的头部元素),最后将栈2的元素重新入栈到栈1中。如此即可完成队列的头部出队,即头删。尾插即直接入栈到栈1中。的图解如下:
代码实现:
class Queue
{
stack1<int>st1;
stack2<int>st2;
public:
Queue(){}
void appendTail(int value)//入队
{
stack1.push(value)l;
}
int deleteHead()//出队
{
if (stack1.empty())return -1;
while (!stack1.empty())//st1-->st2
{
int tmp = stack1.top();
stack1.pop();
stack2.push(tmp);
}
int res = stack2.top();//第一个元素请滚出去
stack2.pop();
while (stack2.empty())//st2-->st1
{
int tmp = stack2.top();
stack1.pop();
stack1.push(tmp);
}
return res;
}
};