day10 第五章 栈与队列
理论基础
- 三个STL版本:
(1)HP STL;(2)P.J.Plauger STL ;(3)SGI STL; - 栈和队列是SGI STL里面的数据结构
- 栈(stack):后进先出
- 栈和队列是STL(c++标准库)里的两个数据结构;
- 栈提供push和pop等接口,
- 栈不提供走访功能,也不提供迭代器(iterator)。
- 栈以底层容器完成其所有工作,对外提供统一的接口,底层容器是可插拔的(可以控制使用哪种容器来实现栈的功能)。
- STL中栈被归类为container adapter(容器适配器)。
- 栈的底层实现可以是vector,deque,list。主要是数组和链表的底层实现。
- 常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。
- deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑。
- 使用vector为底层容器的栈,初始化语句:
std::stack<int, std::vector<int>> third;
- 队列(queue):先进先出的数据结构,不允许有遍历行为,不提供迭代器,SGI STL中队列一样是以deque为缺省情况下的底部结构。
- 使用list为底层容器的队列,初始化语句:
std::queue<int, std::list<int>> third;
232.用栈实现队列
-
使用栈实现队列的操作:
push(x)(入) – 将一个元素放入队列的尾部。
pop(x) (出)-- 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。 -
思路:两个栈-一个入栈,一个出栈
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
if (stOut.empty()) {
while (!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {
int res = this->pop();//pop函数复用
stOut.push(res);//由于pop函数已经弹出res,所以再加入res
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};
225. 用队列实现栈
-
使用队列实现栈的操作:
push(x) – 元素 x 入栈;
pop(x) – 移除栈顶元素
top(x) – 获取栈顶元素
empty() – 返回栈是否为空 -
思路:用一个队列实现栈
用一个队列在模拟栈弹出元素时,把队列头部元素(除最后一个元素外)重新添加到队列尾部,再弹出元素。
class MyStack {
public:
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 result = que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};