两者均是 c++ 中的序列化容器,区别在于:
std::stack 元素是先进后出
std::queue 元素是先进先出


两者底层容器可以是 list 也可以是 deque ;
为了保证 两个序列式容器的特点, 两者均不支持遍历,也不支持迭代器。
std::stack
| 函数 | 说明 |
| stack() | 空构造函数 |
| 函数 | 说明 |
| push | 在栈顶 放入元素 |
| emplace | 在栈顶 放入元素,也可以放入元素类的参数,实现原地构造 |
| pop | 弹出栈顶元素 |
| 函数 | 说明 |
| top | 返回栈顶元素的引用 |
| 函数 | 说明 |
| empty | 判断栈是否为空 |
| size | 返回栈中元素个数 |
代码如下:
- #include
- #include
-
-
- int main()
- {
-
- // 1. constructor
- std::stack<int> tmp_stack;
-
-
- // 2. Modifiers
- tmp_stack.push(1);
- tmp_stack.push(2);
- tmp_stack.push(3);
- tmp_stack.push(3);
-
- tmp_stack.pop();
-
- tmp_stack.emplace(4);
- tmp_stack.emplace(5);
-
-
- // 3. Element access
-
- std::cout << tmp_stack.top() << std::endl;
- std::cout << "------" << std::endl;
-
- // 4. Capacity
-
- std::cout << tmp_stack.empty() << std::endl;
- std::cout << tmp_stack.size() << std::endl;
- std::cout << "------" << std::endl;
-
- while (!tmp_stack.empty()) {
- std::cout << tmp_stack.top() << " ";
- tmp_stack.pop();
- }
- return 0;
- }

https://en.cppreference.com/w/cpp/container/queue/queue
| 函数 | 说明 |
| queue | 空构造函数 |
| 函数 | 说明 |
| push | 在队尾放入元素 |
| emplace | 在队尾 放入元素,也可以放入元素类的参数,实现原地构造 |
| pop | 弹出队首元素 |
| 函数 | 说明 |
| front | 返回队首元素的引用 |
| back | 返回队尾元素的引用 |
| 函数 | 说明 |
| empty | 判断queue 是否为空 |
| size | 返回queue中元素个数 |
代码:
- #include
- #include
-
- int main()
- {
- // 1. constructor
- std::queue<int> tmp_queue;
-
- // 2. Modifiers
- tmp_queue.push(1);
- tmp_queue.push(2);
- tmp_queue.push(3);
- tmp_queue.push(3);
-
- tmp_queue.pop();
-
- tmp_queue.emplace(4);
- tmp_queue.emplace(5);
-
-
- // 3. Element access
-
- std::cout << tmp_queue.front() << std::endl;
- std::cout << tmp_queue.back() << std::endl;
- std::cout << "------" << std::endl;
-
- // 4. Capacity
-
- std::cout << tmp_queue.empty() << std::endl;
- std::cout << tmp_queue.size() << std::endl;
- std::cout << "------" << std::endl;
-
- while (!tmp_queue.empty()) {
- std::cout << tmp_queue.front() << " ";
- tmp_queue.pop();
- }
输出:

下面代码中的 my_deque.h 为 这个博客中实现的 my_deque
C++ -- 学习系列 std::deque 的原理与使用-CSDN博客
- // my_stack.h
-
- #include"my_deque.h"
-
- template<typename T>
- class my_stack
- {
- public:
- my_stack()
- {
-
- }
- ~my_stack()
- {
-
- }
-
- void push(T& val)
- {
- data.push_back(val);
- }
-
- void push(T&& val)
- {
- data.push_back(val);
- }
-
- T& top()
- {
- return data.back();
- }
-
- void pop()
- {
- data.pop_back();
- }
-
- int size()
- {
- return data.size();
- }
-
- bool empty()
- {
- return data.empty();
- }
-
- private:
- my_deque
16> data; -
- };
- // main.cpp
- int main()
- {
- // 1. constructor
- std::stack<int> tmp_stack;
-
-
- // 2. Modifiers
- tmp_stack.push(1);
- tmp_stack.push(2);
- tmp_stack.push(3);
- tmp_stack.push(3);
-
- tmp_stack.pop();
-
- tmp_stack.emplace(4);
- tmp_stack.emplace(5);
-
-
- // 3. Element access
-
- std::cout << tmp_stack.top() << std::endl;
- std::cout << "------" << std::endl;
-
- // 4. Capacity
-
- std::cout << tmp_stack.empty() << std::endl;
- std::cout << tmp_stack.size() << std::endl;
- std::cout << "------" << std::endl;
-
- while (!tmp_stack.empty()) {
- std::cout << tmp_stack.top() << " ";
- tmp_stack.pop();
- }
-
- return 0;
- }
输出:
- // my_queue.h
-
- #include"my_deque.h"
-
- template<typename T>
- class my_queue
- {
- public:
- my_queue()
- {
-
- }
- ~my_queue()
- {
-
- }
-
- void push(T& val)
- {
- data.push_back(val);
- }
-
- void push(T&& val)
- {
- data.push_back(val);
- }
- void pop()
- {
- data.pop_front();
- }
-
- T& front()
- {
- return data.front();
- }
-
- T& back()
- {
- return data.back();
- }
-
- bool empty()
- {
- return data.empty();
- }
-
- int size()
- {
- return data.size();
- }
-
- private:
- my_deque
16> data; -
- };
-
-
- // main.cpp
-
- int main()
- {
- // 1. constructor
- my_queue<int> tmp_queue;
-
-
- // 2. Modifiers
- tmp_queue.push(1);
- tmp_queue.push(2);
- tmp_queue.push(3);
- tmp_queue.push(3);
-
- tmp_queue.pop();
-
-
- // 3. Element access
-
- std::cout << tmp_queue.front() << std::endl;
- std::cout << tmp_queue.back() << std::endl;
- std::cout << "------" << std::endl;
-
- // 4. Capacity
-
- std::cout << tmp_queue.empty() << std::endl;
- std::cout << tmp_queue.size() << std::endl;
- std::cout << "------" << std::endl;
-
- while (!tmp_queue.empty()) {
- std::cout << tmp_queue.front() << " ";
- tmp_queue.pop();
- }
-
- return 0;
- }
输出:
