一、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:先入先出、队头操作