[剑指Offer笔记]07 栈和队列
栈
- 栈: 先进后出 / 后进先出
- 一般不考虑排序: 需要O(n)时间找到最大/最小值
队列
- 队列: 先进先出 / 后进后出
- 在按层次遍历树的时候需要用到!
题目描述:
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。
- 队列中的元素为int类型。
分析:
-
方法1:
在push时做额外操作,就是将stack1压入stack2,node放入stack1底部,再将stack2重新压回stack1;
-
方法2:
压入堆栈的时候,就直接压入s1;
但是出队的时候,需要将s1的压入s2(若s2为空),再出队
s2不为空,则可以直接有栈顶元素出队
实现1:
namespace pro7_1{
// 我的笨方法!
// 只在push时做额外操作,就是将stack1压入stack2,node放入stack1底部,再将stack2重新压回stack1;
class Solution{
public:
void push(int node) {
while(stack1.size()) {
stack2.push(stack1.top());
stack1.pop();
}
stack1.push(node);
while (stack2.size()) {
stack1.push(stack2.top());
stack2.pop();
}
}
int pop() {
int result = 0;
if (stack1.size()) {
result = stack1.top();
stack1.pop();
}
return result;
}
private:
stack<int> stack1;
stack<int> stack2;
};
}
实现2:
namespace pro7_2 {
// 比较优秀的方法:
// stack1,stack2都充分的利用
// 压入堆栈的时候,就直接压入s1;
// 但是出队的时候,需要将s1的压入s2(若s2为空),再出队
// s2不为空,则可以直接有栈顶元素出队
class Solution {
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if (stack2.empty()) {
while (stack1.size()) {
stack2.push(stack1.top());
stack1.pop();
}
}
int result = stack2.top();
stack2.pop();
return result;
}
private:
stack<int> stack1;
stack<int> stack2;
};
}
做题体会:
- 注意 if 和 while 别写错了!!!
- 充分利用栈和队列的特点!!!