在写代码前,首先要明确两者的 “数据访问规则”—— 这是它们区别于其他容器的关键:

容器

核心规则

访问特性

适用场景

stack

后进先出

仅能访问“栈顶”元素

函数调用栈、表达式求值、撤销操作

queue

先进先出

仅能访问“队头”和“队尾”元素

任务调度、消息队列、广度优先搜索

两者的共性是 “限制访问”:不支持随机访问(如 [] 下标),也不支持迭代器遍历 —— 目的是强制遵循其数据规则,避免错误的访问方式


二. Stack(栈):后进先出
2.1 核心特性:
  • 访问规则:只能从"栈顶"添加或删除元素(最后入栈的元素最先出栈)
  • 适用场景:函数调用栈,表达式求值等

2.2 头文件与定义

代码语言:javascript

AI代码解释

#include <stack>  //头文件
using namespace std;

// 定义栈:默认存储int类型,底层依赖deque实现
stack<int> st;

// 可指定底层容器
stack<int, vector<int>> st_v;  // 基于vector的栈
stack<int, list<int>> st_l;    // 基于list链表的栈
2.3 常用接口大全

接口

功能描述

示例

push(val)

向栈顶添加元素,新元素成为新的栈顶

st.push(10)

pop()

删除当前栈顶元素(操作后原栈顶的下一个元素成为新栈顶),无返回值,需先确保栈非空

st.pop()

top()

返回栈顶元素的引用(可直接读取或修改栈顶值),需先确保栈非空

int x = st.top();(读取);st.top() = 20;(修改)

size()

返回栈中当前存储的元素总个数,返回值为无符号整数(size_t)

cout << st.size();

empty()

判断栈是否为空,若栈中无元素则返回 true,否则返回 false

if (!st.empty()) { ... }

2.4 用法演示

代码语言:javascript

AI代码解释

void test_stack()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.emplace(4);

	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
}

int main()
{
	test_stack();
}


三. Queue(队列):先进先出
3.1 核心特性:
  • 访问规则:从"队尾"添加元素,从"队头"删除元素(最先入队的元素最先出队)

更多推荐