栈和队列-理论基础
参考:代码随想录
栈(stack)
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能);
STL 中栈是用什么容器实现的?
从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现;

我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构;
deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了;
我们也可以指定vector为栈的底层实现,初始化语句如下:
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
队列(queue)
队列的情况与栈是一样的;
队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构;
也可以指定list 为起底层实现,初始化queue的语句如下:
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
232.用栈实现队列
大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:代码随想录
#include <iostream>
#include <stack>
using namespace std;
class MyQueue {
public:
stack<int> stIn; // 输入栈,用于入队操作
stack<int> stOut; // 输出栈,用于出队操作
// 构造函数,初始化对象
MyQueue() {}
// 入队操作,将元素 x 推入队列的尾部
void push(int x) { stIn.push(x); }
// 出队操作,删除队列的头部元素并返回
int pop() {
// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
if (stOut.empty()) {
// 从stIn导入数据直到stIn为空
while (!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
// 返回 stOut 的栈顶元素(即队列的头部元素)
int result = stOut.top();
stOut.pop();
return result;
}
// 获取队列的头部元素,但不删除
int peek() {
// this 指的是调用该函数的 MyQueue 类的对象
int res = this->pop(); // 直接使用已有的pop函数
stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
/** Returns whether the queue is empty. */
bool empty() { return stIn.empty() && stOut.empty(); }
};
int main() {
MyQueue queue;
// 入队操作
queue.push(1);
queue.push(2);
// 获取头部元素,但不删除
cout << "Peek: " << queue.peek() << endl;
// 出队操作
cout << "Pop: " << queue.pop() << endl;
// 检查队列是否为空
cout << "Is the queue empty? " << (queue.empty() ? "Yes" : "No") << endl;
cin.get();
return 0;
}
225. 用队列实现栈
可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解
题目链接/文章讲解/视频讲解:代码随想录
本文介绍了栈和队列的基本概念,探讨了STL中的实现方式,以及如何用栈和队列进行模拟操作,包括用一个队列实现栈的实例。
519

被折叠的 条评论
为什么被折叠?



