一 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. 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;
}
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. 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博客
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. 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;
}
输出:
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.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;
}
输出: