入门级题解:剑指 Offer 09. 用两个栈实现队列
作者:互联网
题目
- 用两个栈实现一个队列。
- 队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。
- (若队列中没有元素,deleteHead 操作返回 -1 )
读题
队列:先入先出
栈:先入后出
在队列尾部插入整数和在队列头部删除整数的功能
对外界是个黑盒,内部构造不知道,只输入输出
插入 1 1
删除 null
插入 2 2
删除 null
删除 返回-1
原来比如栈是 1 2 3 4 5
那现在就从尾部插入是 1 2 3 4 5 6
头部删除 就删1 得到2 3 4 5 6
如果只用一个栈,只能入栈,尾部插入比较好实现,直接入栈就可以,但头部删除不方便,得全部出栈
所以设stack1:1 2 3 4 5插入的话就直接入stack1
再设stack2:把stack1中的先出栈再入栈,换个顺序,现在就是 5 4 3 2 1
伪代码
队列尾部插入整数:stack1.push_back()
stack2.push_back(stack1.pop())
队列头部删除整数:stack2.pop
关键代码分析
if(sta2.empty()){
while(!sta1.empty()){
sta2.push(sta1.top());
sta1.pop();
}
}
为什么只有sta2空的时候才把sta1的给他出栈送过来
例子: sta1 从底到top是 a b c d e f
sta2空的
给sta2:f e d c b a
sta2删除一个 f e d c b
sta1 加1 个:sta1: o
如果这时候给sta2:f e d c b o
这样次序就乱了,正确的次序应该是 o f e d c b
所以得sta2空了再颠倒次序。
收获
- 建栈:stack sta;
- 入栈:sta.push();
- 出栈:sta.pop();
- sta.pop()是个操作,不是值,用sta.top();
代码
class CQueue {
stack <int> sta1;
stack <int> sta2;
public:
CQueue() {
}
//队列尾部插入整数
void appendTail(int value) {
sta1.push(value);
//int top1 = sta1.top();//测试数据
}
int deleteHead() {
if(sta2.empty()){
while(!sta1.empty()){
sta2.push(sta1.top());
sta1.pop();
}
}
if(sta2.empty()){
return -1;
}
int delItem = sta2.top();
sta2.pop();
return delItem;
}
};
标签:sta2,sta1,队列,题解,top,09,pop,Offer,插入 来源: https://blog.csdn.net/m0_46663240/article/details/122770034