4.9 KiB
4.9 KiB
Stack
概念:
Stack 是 C# 提供的一个==非泛型栈集合==
栈的特点是:==先进后出,后进先出==
英文:
LIFO:Last In First Out
简单理解: 像一摞盘子 最后放上去的,最先被拿走
命名空间:
using System.Collections;
通常用法
- 处理需要“后进先出”的数据
- 临时保存操作记录
- 实现撤销、回退、调用顺序等逻辑
- 学习栈这种数据结构
实际开发中:
新代码更推荐使用 Stack<T>
这里的 Stack 是非泛型版本,主要用于理解集合和数据结构
语法
创建:
Stack stack = new Stack();
入栈:
stack.Push(数据);
出栈:
object value = stack.Pop();
查看栈顶:
object value = stack.Peek();
数量:
stack.Count
基础案例
using System;
using System.Collections;
Stack stack = new Stack();
stack.Push("第一步");
stack.Push("第二步");
stack.Push("第三步");
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
输出:
第三步
第二步
第一步
理解:
"第一步"最先进栈"第三步"最后进栈Pop()会先取出最后进去的元素
Push、Pop、Peek
Push:
把元素放到栈顶
stack.Push("A");
Pop:
取出并删除栈顶元素
object item = stack.Pop();
Peek:
只查看栈顶元素,不删除
object item = stack.Peek();
案例:
Stack stack = new Stack();
stack.Push("A");
stack.Push("B");
Console.WriteLine(stack.Peek()); // B
Console.WriteLine(stack.Count); // 2
Console.WriteLine(stack.Pop()); // B
Console.WriteLine(stack.Count); // 1
遍历
Stack stack = new Stack();
stack.Push("A");
stack.Push("B");
stack.Push("C");
foreach (object item in stack)
{
Console.WriteLine(item);
}
输出顺序一般是:
C
B
A
理解:
遍历 Stack 时,也是从栈顶到栈底
常用成员
Stack stack = new Stack();
stack.Push("A");
stack.Push("B");
Console.WriteLine(stack.Count);
Console.WriteLine(stack.Contains("A"));
object top = stack.Peek();
object value = stack.Pop();
stack.Clear();
常用方法:
Push(object obj):入栈Pop():出栈并删除Peek():查看栈顶但不删除Contains(object obj):判断是否包含Clear():清空ToArray():转成数组
空栈不能 Pop 或 Peek
错误写法:
Stack stack = new Stack();
stack.Pop();
原因: 栈里没有元素,不能取栈顶
更稳的写法:
if (stack.Count > 0)
{
object value = stack.Pop();
}
Peek() 也一样,使用前最好先判断 Count。
取值时要类型转换
Stack stack = new Stack();
stack.Push(100);
int num = (int)stack.Pop();
原因:
非泛型 Stack 中的元素按 object 存储
取出来也是 object
如果值类型放进去,会涉及装箱和拆箱:
stack.Push(100); // 装箱
int num = (int)stack.Pop(); // 拆箱
适合场景:撤销操作
Stack undoStack = new Stack();
undoStack.Push("创建角色");
undoStack.Push("移动角色");
undoStack.Push("修改颜色");
if (undoStack.Count > 0)
{
string lastAction = (string)undoStack.Pop();
Console.WriteLine("撤销:" + lastAction);
}
理解: 最后做的操作,通常最先撤销 所以适合用栈
Stack 和 ArrayList 的区别
| 对比点 | ArrayList | Stack |
|---|---|---|
| 访问方式 | 按下标访问 | 只关心栈顶 |
| 数据顺序 | 按添加顺序保存 | 后进先出 |
| 添加方法 | Add |
Push |
| 取出方法 | list[index] |
Pop / Peek |
| 适合场景 | 普通列表 | 回退、撤销、临时反向处理 |
注意
Stack在System.Collections命名空间中Stack是非泛型集合,元素按object存储- 栈的规则是后进先出
Push是入栈Pop是取出并删除栈顶Peek是查看栈顶但不删除- 空栈调用
Pop()或Peek()会出错 - 新项目通常优先使用
Stack<T>
一句话记忆
==Stack 是后进先出的集合,最后放进去的最先出来。==
面试/复习时怎么说
可以这样答:
“Stack 是栈结构,特点是后进先出,也就是 LIFO。
常用方法有 Push、Pop 和 Peek,分别表示入栈、出栈、查看栈顶。
非泛型 Stack 存的是 object,取值时可能需要强制类型转换,新项目中更推荐使用 Stack<T>。”
引用:
- Microsoft Learn: Stack Class
- Microsoft Learn: System.Collections Namespace
#Stack #栈 #集合 #进阶