C# Stack栈 / Queue队列+所有集合 终极一页汇总(全覆盖、零遗漏)

一、Stack 栈集合(先入后出)

1. 核心特点(必背)

先入后出 / 后进先出(LIFO)

  • 最先存入的元素在栈底

  • 最后存入的元素在栈顶

  • 入栈:添加元素 Push()

  • 出栈:删除元素 Pop()

2. 两种定义方式

复制代码
// 1.泛型栈(推荐、类型安全、无装箱拆箱、项目主流)
Stack<int> stack = new Stack<int>();

// 2.非泛型栈(过时、object类型、不安全、有装箱拆箱、仅考试考察)
Stack stack1  = new Stack();

3. 核心API精讲(结合你的代码)

复制代码
stack1.Push("张三"); // 栈底
stack1.Push("李四");
stack1.Push("王五"); // 栈顶

// Pop():删除【栈顶】元素 + 返回该元素
Console.WriteLine(stack1.Pop()); // 输出:王五

// Peek():只获取【栈顶】元素,不删除
Console.WriteLine(stack1.Peek()); // 输出:李四

4. 栈的遍历(超级易错)

栈 没有下标,不能直接索引遍历

必须先转数组:ToArray()

复制代码
// for遍历:必须转数组
for (int i = 0; i < stack1.Count; i++)
{
    Console.WriteLine(stack1.ToArray()[i]);
}

// foreach 直接遍历(顺序:栈顶→栈底)
foreach(var i in stack1)
{
    Console.WriteLine(i+"-----");
}

5. 其他常用方法

  • Clear():清空所有元素

  • Contains():判断是否包含指定元素,返回bool

  • Count:获取元素个数


二、Queue 队列集合(先入先出)

1. 核心特点(必背)

先入先出 / 先进先出(FIFO),和排队一模一样

  • 最先入队的元素最先出队

  • 入队:Enqueue()

  • 出队:Dequeue()

2. 完整代码精讲

复制代码
Queue<string> queue = new Queue<string>();
queue.Enqueue("hello1"); // 队头
queue.Enqueue("hello2");
queue.Enqueue("hello3"); // 队尾

// Dequeue():删除【队头】元素 + 返回
Console.WriteLine(queue.Dequeue()); // hello1

// Peek():只获取【队头】,不删除
Console.WriteLine(queue.Peek()); // hello2

// 遍历顺序:队头 → 队尾
foreach (var item in queue)
{
    Console.WriteLine(item);
}

三、Stack 与 Queue 终极对比(简答题满分)

集合 规则 添加方法 删除方法 取值不删除
Stack 栈 先入后出(LIFO) Push 入栈 Pop 出栈(删顶) Peek 取栈顶
Queue 队列 先入先出(FIFO) Enqueue 入队 Dequeue 出队(删头) Peek 取队头

四、高频易错坑点(必考)

  • 栈、队列 都没有索引,不能直接 i 取值

  • 栈、队列遍历必须 ToArray() 后才能 for 循环

  • Pop / Dequeue:删除+返回元素

  • Peek:只返回、不删除

  • 栈遍历顺序:栈顶 → 栈底(倒序)

  • 队列遍历顺序:队头 → 队尾(正序)


五、极简背诵口诀

  • 栈是后进先出,Push压栈Pop弹顶

  • 队列先进先出,Enqueue入队Dequeue出首

  • Peek查看不拿走,Pop Dequeue取出就删除

  • 无索引不能下标,转数组才可for遍历

------------------所有集合------------------------

一、八大容器 核心分类(先分清大类)

1. 顺序线性集合(单列数据)

数组、ArrayList、List<T>

2. 键值对集合(映射关系数据)

Hashtable、Dictionary、SortedList

3. 特殊规则集合(受限进出)

Stack栈、Queue队列


二、终极最全总表(直接默写满分)

集合类型 是否泛型 长度 排序 索引访问 核心特点 装箱拆箱 使用状态
Array 数组 是 固定 无序/可手动排 支持下标 性能最高、长度不可变 无 常用
ArrayList 否 动态 无序 支持下标 任意类型混搭、类型不安全 有 淘汰
List<T> 是 动态 无序/可手动排 支持下标 有序列表、增删灵活、项目首选 无 主流
Hashtable 否 动态 无序 不支持 键值对、object存储、查找快 有 淘汰
Dictionary 是 动态 无序 不支持 泛型安全、高性能键值对、首选 无 主流
SortedList 否 动态 自动Key升序 支持下标 唯一有序键值对、双访问方式 有 小众
Stack 栈 可泛型 动态 无序 无索引 先入后出(LIFO) 泛型无 常用
Queue 队列 可泛型 动态 无序 无索引 先入先出(FIFO) 泛型无 常用

三、Count / Length 终极区分(必考坑)

  • Length :只属于数组

  • Count:所有集合(List、字典、哈希表、SortedList、栈、队列)


四、泛型 / 非泛型 终极规律

1. 非泛型(老旧、淘汰、不安全、装箱拆箱)

ArrayList、Hashtable、SortedList、Stack(非泛型)、Queue(非泛型)

2. 泛型(现代、安全、高性能、无装箱)

数组、List<T>、Dictionary<K,V>、Stack<T>、Queue<T>


五、三大类集合 选型公式(做题万能)

1. 存单列数据

  • 数据固定不变 → 数组

  • 数据频繁增删 → List<T>

2. 存对应关系数据

  • 不需要排序、追求性能 → Dictionary

  • 需要自动按键排序 → SortedList

3. 特殊规则

  • 后进先出 →Stack 栈

  • 先进先出 → Queue 队列


六、高频超级易错点(考前必看)

  • Dictionary / Hashtable:无索引,不能 for 下标遍历

  • SortedList:键必须同类型可比较,否则报错

  • List、数组 :元素可重复;字典键绝对唯一

  • Pop() / Dequeue():取出并删除

  • Peek():只查看、不删除

  • Array.Reverse:只是反转,不是排序

  • ArrayList、Hashtable 考试常考,项目绝不使用


七、所有集合 一句话极简总结

  • 数组:固定长度、性能最高、不能扩容

  • ArrayList:动态扩容、老旧不安全、被List替代

  • List:动态有序、泛型安全、列表王者

  • Hashtable:老旧键值对、不安全、被字典替代

  • Dictionary:无序键值对、高性能、项目首选

  • SortedList:自动按键排序、唯一可索引键值对集合

  • Stack:先入后出、栈顶操作

  • Queue:先入先出、队头操作

相关推荐
非优秀程序员9 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻10 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
沐晓时光10 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
文丑颜不良啊12 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang13 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪13 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息14 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼14 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff15 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff16 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc