**剑指 Offer 09. 用两个栈实现队列**
说明
这题一看题目,感觉就是用两个栈去模拟队列先进先出的特点。stack1压入全部元素,再把元素以弹出的方式压入stack2,但是这里要注意,先压入stack2,再pop stack1的元素个人感觉要这样。
看下示例,觉得就看不懂了。最后就看评论解答了。
apppendTail是实现在队列尾部插入功能(相当于压入栈的功能),deletHead是实现删除队列头(此时队列的头就是stack2的栈顶)所以就是把stack2的TOP弹出就行了。
示例说明
输出那里对应的数字就代表对应函数执行后返回的值,如果栈为空,执行deletHead函数则返回-1。
输入就代表函数传递进去的数值。
思路
/*
1.创建两个stack
2.把两个stack全部初始化为空(while(判断) stack.pop)
3.appendTail 压栈操作
4.deletHead
{
stack2判空,如果栈为空则返回-1
while(stack1判空)
把stack1.top压入stack2
把stcack1.pop (循环做这两部)
最后就stack2.pop作为返回值丢出去
}
今天回来刷这道题,在面对delethead那里开始犯难了,因为stack1判空 在加上while(!stack2.empty())的方法,一运行,发现太慢了。所以特意来看看这个记录。用下面这个方法就不用两个while,不管stack1是否为空,先把stack1的东西压入stack2中,这样就可以只判断stack2了。
ps:有一个情况是stack1为空,但是stack2还有元素,那么再怎么判别stack1,都会出错
*/
代码
//C++
class CQueue {
stack<int> stack1,stack2;
public:
CQueue()
{
while (!stack1.empty()||!stack2.empty())
{
stack1.pop();
stack2.pop();
}
}
void appendTail(int value) {
stack1.push(value);
}
int deleteHead() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
if (stack2.empty()) {
return -1;
} else {
int deleteItem = stack2.top();
stack2.pop();
return deleteItem;
}
}
};