一 std::stack 与 std::queue 分别是什么?
两者均是 c++ 中的序列化容器,区别在于:
std::stack 元素是先进后出
std::queue 元素是先进先出
二 std::stack 与 std::queue 原理
1 std:statck
2. std::queue
两者底层容器可以是 list 也可以是 deque ;
为了保证 两个序列式容器的特点, 两者均不支持遍历,也不支持迭代器。
三 常见函数接口与使用
1. std::stack
1.1 构造函数
std::stack<T,Container>::stack - cppreference.com
函数 | 说明 |
stack() | 空构造函数 |
1.2 容器修改
函数 | 说明 |
push | 在栈顶 放入元素 |
emplace | 在栈顶 放入元素,也可以放入元素类的参数,实现原地构造 |
pop | 弹出栈顶元素 |
1.3 容器访问
函数 | 说明 |
top | 返回栈顶元素的引用 |
1.4 容器空间
函数 | 说明 |
empty | 判断栈是否为空 |
size | 返回栈中元素个数 |
代码如下:
#include<iostream>
#include<stack>int main()
{// 1. constructorstd::stack<int> tmp_stack;// 2. Modifierstmp_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 accessstd::cout << tmp_stack.top() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::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;
}
2. std::queue
1.1 构造函数
https://en.cppreference.com/w/cpp/container/queue/queue
函数 | 说明 |
queue | 空构造函数 |
1.2 容器修改
函数 | 说明 |
push | 在队尾放入元素 |
emplace | 在队尾 放入元素,也可以放入元素类的参数,实现原地构造 |
pop | 弹出队首元素 |
1.3 容器访问
函数 | 说明 |
front | 返回队首元素的引用 |
back | 返回队尾元素的引用 |
1.4 容器空间
函数 | 说明 |
empty | 判断queue 是否为空 |
size | 返回queue中元素个数 |
代码:
#include<iostream>
#include<queue>int main()
{// 1. constructorstd::queue<int> tmp_queue;// 2. Modifierstmp_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 accessstd::cout << tmp_queue.front() << std::endl;std::cout << tmp_queue.back() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::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博客
1. my_stack
// 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<T, 16> data;};
// main.cpp
int main()
{// 1. constructorstd::stack<int> tmp_stack;// 2. Modifierstmp_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 accessstd::cout << tmp_stack.top() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::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;
}
输出:
2. my_queue
// 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<T, 16> data;};// main.cppint main()
{// 1. constructormy_queue<int> tmp_queue;// 2. Modifierstmp_queue.push(1);tmp_queue.push(2);tmp_queue.push(3);tmp_queue.push(3);tmp_queue.pop();// 3. Element accessstd::cout << tmp_queue.front() << std::endl;std::cout << tmp_queue.back() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::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;
}
输出: