CS4L2——Stack
本章代码关键字
1 2 3 4 5 6 7 8
| Stack stack.Push() stack.Pop() stack.Peek() stack.Contains() stack.Clear() stack.Count stack.ToArray()
|
Stack
Stack
(栈)是一个C#为我们封装好的类,它的本质是 object[]
数组,只是封装了特殊的存储规则
Stack
是栈存储容器,栈是一种先进后出的数据结构
先存入的数据后获取,后存入的数据先获取,栈是先进后出
使用 Stack
需要引用 System.Collections
这个命名空间
1 2 3 4 5 6 7 8 9
| using System.Collections;
class Program { static void Main(string[] args) { Stack stack = new Stack(); } }
|
压取查改
压
向栈增加元素通常被称为压栈,因为它类似于向弹匣压入子弹,可以放任意类型,但只能一个一个放
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Test { }
using System.Collections;
class Program { static void Main(string[] args) { Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true); stack.Push(1.2f); stack.Push(new Test()); } }
|
取(弹)
栈不存在删除的概念,只有取的概念,即弹栈,类似于弹匣弹出子弹
1 2 3 4 5 6 7 8
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true); stack.Push(1.2f);
object v = stack.Pop(); Console.WriteLine(v);
|
输出:
查
栈无法查看指定位置的元素,只能查看栈顶的内容
1 2 3 4 5 6 7
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true);
object? v = stack.Peek(); Console.WriteLine(v);
|
输出:
查看元素是否存在与栈中
1 2 3 4 5 6 7 8 9 10
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true);
if (stack.Contains("123")) { Console.WriteLine("存在"); }
|
输出:
改
栈无法改变其中元素,只能压和取,实在要改,只能清空
清空
遍历
栈元素数量
1 2 3 4 5 6
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true);
Console.WriteLine(stack.Count);
|
输出:
foreach 迭代器循环
Stack
不能用 for
循环,因为 Stack
没有索引器,只能通过迭代器(#TODO#)遍历
1 2 3 4 5 6 7 8 9
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true);
foreach (var item in stack) { Console.WriteLine(item); }
|
输出:
转换为数组
还有一种遍历 stack
的方式,将栈转换为 object
的数组,遍历出来的顺序也是从栈顶到栈底
1 2 3 4 5 6 7 8 9 10 11
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true);
object[] array = stack.ToArray();
for (int i = 0; i < array.Length; i++) { Console.WriteLine(array[i]); }
|
输出:
循环弹栈
1 2 3 4 5 6 7 8 9 10 11 12
| Stack stack = new Stack(); stack.Push(1); stack.Push("123"); stack.Push(true);
Console.WriteLine("stack.Count: " + stack.Count); while (stack.Count > 0) { object o = stack.Pop(); Console.WriteLine(o); } Console.WriteLine("stack.Count: " + stack.Count);
|
输出:
1 2 3 4 5
| stack.Count: 3 True 123 1 stack.Count: 0
|
装箱拆箱
由于用万物之父 object
来存储数据,自然存在装箱拆箱,
当往其中进行值类型存储时就是在装箱,将值类型对象取出来转换使用时,就是在拆箱