栈和队列理论基础
栈是先进后出的数据结构,队列是先进先出的结构。如图所示。 ![Stack & Queue](2023-02-24T091014.png)
C++中的STL有三儿比较普遍的版本:
HP STL,是C++ STL的第一个实现版本,而且开放源代码。
P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual
C++编译器所采用,不是开源的。
SGI STL 由Silicon Graphics Computer Systems公司参照HP
STL实现,被Linux的C++编译器GCC所采用,SGI
STL是开源软件,源码可读性甚高。
C++的栈和队列不是一个容器,而是一个容器适配器,其内部的数据存储形式可以由不同的其他数据实现,如vector,
deque, list等。
目前使用最广泛的SGI
STL中,deque是默认的栈的底层实现。开发者也可以指定栈的底层实现。
1
| std::stack<int, std::vector<int> > stack;
|
队列的情况一样,SGI
STL中队列一样是以deque为默认情况下的底部结构。也可以手动指定:
1
| std::queue<int, std::list<int>> queue;
|
232.用栈实现队列
代码随想录链接
题目
LeetCode-232
使用栈实现队列。又是在王道上做过的题
自己的想法
使用两个栈,A栈负责接收输入的数据,在遇到取队首或者出队操作时,若B栈为空,将A栈的元素依次弹出并压入B栈,此时B栈栈顶即为“队首”,若B栈不为空,直接操作B栈栈顶即可。
解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class MyQueue { private: stack<int> in, out; public: MyQueue() {
} void push(int x) { in.push(x); } int pop() { if (out.empty()) { while (!in.empty()) { out.push(in.top()); in.pop(); } } if (!out.empty()) { int val = out.top(); out.pop(); return val; } return -1; } int peek() { int frontVal = this -> pop(); out.push(frontVal); return frontVal; } bool empty() { return in.empty() && out.empty(); } };
|
225.用队列实现栈
代码随想录链接
题目
LeetCode-225
使用队列来实现栈。
自己的想法
重点在处理出栈操作。思路是将队列中的元素不断出队,直到原来在队尾(即“栈顶”)的元素到达队首,再对队首进行出队操作即可。
解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class MyStack { private: queue<int> q; public: MyStack() {
} void push(int x) { q.push(x); } int pop() { int size = q.size(); int tmp; while (--size) { tmp = q.front(); q.pop(); q.push(tmp); } int val = q.front(); q.pop(); return val; } int top() { int topVal = this -> pop(); q.push(topVal); return topVal; } bool empty() { return q.empty(); } };
|