剑指 Offer 09. 用两个栈实现队列
题干:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
分析:队列为先入先出型,栈为先入后出型。若使用两个栈,则某一元素先入后出(第一个栈),再转移到另一个栈。此时,栈顶元素即为第一个进第一个栈的元素。
代码:
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
int output;
if (s2.empty()) // 此操作非常重要。假设插入插入删除 插入插入删除(删除时应该先将第一次插入的删除完,再进行元素填充)
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
if (s2.empty())
output = -1;
else
{
output = s2.top();
s2.pop();
}
return output;
}
private:
stack<int> s1,s2;
};
注意:1、删除操作中,if (s2.empty())不可缺。。(只有当12345全部delete之后,才可往s2中加元素,不然,5可能最后才回pop)
2、 while (!s1.empty()),重复循环直到将s1清空。