题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
class CQueue {
public:
stack<int>stack1;
stack<int>stack2;
CQueue() {}
//尾部插入使用一个栈
void appendTail(int value) {
stack1.push(value);
}
//头删,先将stack1中的数字弹出并压入到stack2中
//则stack2中数字的顺序就是想要得到的队列中的顺序
int deleteHead() {
if(stack1.empty())
return -1;
while(!stack1.empty())
{
int tmp = stack1.top();
stack1.pop();
stack2.push(tmp);
}
//执行头删
int res = stack2.top();
stack2.pop();
//stack2是一个辅助栈,头删后将stack2中的所有数字重新压回Stack1
//原因是,无法确定下一步操作是头删还是尾插,所以压回stack1可以保证
//下一步不论是什么操作都可以保证数字的正确顺序
//验证:压5、2,删一次,压1、2、3,
while(!stack2.empty())
{
int head = stack2.top();
stack2.pop();
stack1.push(head);
}
return res;
}
};