day 10 第五章 栈与队列
今日任务:
● 理论基础
● 232.用栈实现队列
● 225. 用队列实现栈
理论基础
了解一下 栈与队列的内部实现机智,文中是以C++为例讲解的。
文章讲解:代码随想录
232.用栈实现队列
【链接】(文章,视频,题目)
大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:代码随想录
【第一想法与实现(困难)】只知道用栈实现队列一定需要两个栈,但是没想好他们分别要做什么
【看后想法】
-
一个入栈:存放已经压入的元素
-
一个出栈:存放准备弹出的元素。其顺序恰好会跟入栈相反。当出栈空,需要把入栈元素全部逐个转移到出栈
-
注意pop函数与peek函数的代码复用,避免功能相近的代码复制粘贴
【实现困难】无
【自写代码】
class MyQueue {
public:
// - 一个入栈:存放已经压入的元素
// - 一个出栈:存放准备弹出的元素。其顺序恰好会跟入栈相反。当出栈空,需要把入栈元素全部逐个转移到出栈
std::stack<int> st_in;
std::stack<int> st_out;
MyQueue() {
}
void push(int x) {
st_in.push(x);
}
int pop() {
if (st_out.empty()) {
while (!st_in.empty()) {
st_out.push(st_in.top());
st_in.pop();
}
}
int res = st_out.top();
st_out.pop();
return res;
}
int peek() {
int res = this->pop();
st_out.push(res);
return res;
}
bool empty() {
return st_in.empty() && st_out.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
【收获与时长】25min
【链接】(文章,视频,题目)
【第一想法与实现(困难)】没有直接思路
【看后想法】
-
使用两个队列,只有que1存放实际数据,que2只用来辅助,常空。弹出时把要弹出的队列尾元素留下,其他存储到que2
-
只使用一个队列,弹出时将size-1个队列头的元素重新到队尾排队
【实现困难】无
【自写代码】
class MyStack {
public:
// 一个队列实现栈,当需要弹出的时候,将队列头的size-1个元素,重新排队,相当于转个圈,重新加到队尾。而元队列尾元素不动,就到达队列头
std::queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;
while (size--) {
que.push(que.front());
que.pop();
}
int res = que.front();
que.pop();
return res;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
【收获与时长】30min