代码随想录训练营day09(栈和队列)
理论基础
背景知识
栈:先进后出(一个口)
队列:先进先出(两个口)
各种容器的属性
232.用栈实现队列
题目
解题方法(使用两个栈)
- 用两个栈共同实现队列
两个栈共同构成队列,元素不重叠,两者都为空说明“队列”为空
- stackIn负责吸收新人(push简单),stackOut负责赶走老人(pop和peek麻烦)
只有当需要 pop 且 stackOut 为空时,需要把stackIn全部吸收过来(保证顺序),否则各司其职
-------------] [------------
stackOut | | stackIn
-------------] [------------
难点
难点:这两道题的麻烦点都是pop()的实现
犯错:stack.pop()不返回元素,只是出栈操作。stack.top()返回栈顶元素
代码
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result = stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int temp1 = this->pop();
stackOut.push(temp1);
return temp1;
}
bool empty() {
if(stackIn.empty()&&stackOut.empty()){
return true;
}
else return false;
}
};
225. 用队列实现栈
题目
解题方法(使用一个队列)
- 巧妙:只用一个队列模拟栈
- pop 的流程
1、把队列前q.size()-1个元素依次弹出,加入队列,暴露了原来的队列入口q.back()
2、把q.back()弹出
难点
- 和用栈实现队列有什么区别:
1、只用到一个队列,因为队列有两个口,一边出队列一边入队列,不用额外的队列(巧妙)
而栈只有一个口
2、栈仅有一个口top(),队列有出口front()和入口back()
注意事项:
1、push()需要带参数,pop()不需要带参数,记得pop前要存个临时值,不然就失联了
2、这道题的empty判断,直接使用q.empty()就可以了,因为只用到一个队列。而上一题用到了两个栈。
代码
class MyStack {
public:
queue<int>q;
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size = q.size();
size--;
while(size--){
q.push(q.front());
q.pop();
}
int result = q.front();
q.pop();
return result;
}
int top() {
return q.back();
}
bool empty() {
if(q.empty()){
return true;
}
else return false;
}
};