C# Stack用法详解(附带实例)
栈是一个线性的数据结构,特色是由下往上堆放数据,如下所示:
将数据插入栈的动作称为推入(push),动作是由下往上堆放。将数据从栈中读取的动作称为取出,动作是由上往下读取,数据经读取后同时从栈中移除。
由于每一笔数据都在同一端进入与离开栈,整个过程有先进后出(first in last out)的特征,在这个数据结构下有一个栈指针恒指向栈最上方的位置。
如果要创建 Stack 对象,同时还要设定此对象的容量,则可以增加 Int32 参数,详情可以参考下列语法:
如果要创建 Stack 对象,同时将指定项目复制至此对象,则可以使用下列语法:
【实例 1】创建元素是字符串的 Stack 对象,然后输出。
【实例 2】创建 Stack 对象然后输出元素个数。
【实例 3】创建栈数据,然后测试 Push() 和 Pop() 方法。
【实例 4】测试 ToArray() 和 CopyTo() 方法,因为 numberArray 数组是从索引 3 开始放置栈数据的,所以索引 0、1、2 都是空白的。

将数据插入栈的动作称为推入(push),动作是由下往上堆放。将数据从栈中读取的动作称为取出,动作是由上往下读取,数据经读取后同时从栈中移除。
由于每一笔数据都在同一端进入与离开栈,整个过程有先进后出(first in last out)的特征,在这个数据结构下有一个栈指针恒指向栈最上方的位置。
C# Stack对象的创建
如果只是创建 Stack 对象,则可以使用下列语法:Stack<T> 对象名称 = new Stack<T>();
如果要创建 Stack 对象,同时还要设定此对象的容量,则可以增加 Int32 参数,详情可以参考下列语法:
Stack<T> 对象名称 = new Stack<T>(Int32);
如果要创建 Stack 对象,同时将指定项目复制至此对象,则可以使用下列语法:
Stack<T> 对象名称 = new Stack<T>(IEnumerable<T>);
【实例 1】创建元素是字符串的 Stack 对象,然后输出。
string[] str = new string[] { "one", "five", "ten" }; Stack<string> number = new Stack<string>(str); foreach (var n in number) // 后进先出 Console.Write($"{n} ");执行结果为:
ten five one
C# Stack的属性
Stack 的属性为,Count,其可以获得 Stack 对象的元素个数。【实例 2】创建 Stack 对象然后输出元素个数。
string[] books = { "C语言入门教程", "C++基础教程", "Python基础教程" }; Stack<string> mybooks = new Stack<string>(books); Console.WriteLine($"栈元素数量:{mybooks.Count}");执行结果为:
栈元素数量:3
C# Stack方法
Stack 的常用方法如下:方法名称 | 描述 |
---|---|
Stack<T>.Push(T) | 在栈顶端增加元素。 |
Stack<T>.Pop() | 读取和移除栈顶端元素。 |
Stack<T>.Peek() | 读取栈顶端元素,但是不移除此元素。 |
Stack<T>.Contains(T) | 回传元素是否存在,如果存在则回传 true,反之则回传 false。 |
Stack<T>.Clear() | 清除所有元素。 |
Stack<T>.ToArray(T) | 将栈复制到数组。 |
Stack<T>.CopyTo(T[] array, int arrayIndex) | 复制栈到数组指定索引位置。 |
【实例 3】创建栈数据,然后测试 Push() 和 Pop() 方法。
Stack<string> numbers = new Stack<string>(); numbers.Push("one"); numbers.Push("two"); numbers.Push("three"); Console.WriteLine($"栈元素数量:{numbers.Count}"); Console.WriteLine($"Peek() 资料:{numbers.Peek()}"); Console.WriteLine($"Peek()后栈元素数量:{numbers.Count}"); Console.WriteLine($"Pop() 资料:{numbers.Pop()}"); Console.WriteLine($"Pop()后栈元素数量:{numbers.Count}"); Console.WriteLine($"Pop() 资料:{numbers.Pop()}");栈元素数量:3
Peek() 资料:three
Peek()后栈元素数量:3
Pop() 资料:three
Pop()后栈元素数量:2
Pop() 资料:two
【实例 4】测试 ToArray() 和 CopyTo() 方法,因为 numberArray 数组是从索引 3 开始放置栈数据的,所以索引 0、1、2 都是空白的。
Stack<string> numbers = new Stack<string>(); numbers.Push("one"); numbers.Push("two"); numbers.Push("three"); var numberArray1 = numbers.ToArray(); // ToArray() foreach (var n in numberArray1) Console.Write(n + " "); Console.WriteLine(); string[] numberArray2 = new string[numbers.Count * 2]; numbers.CopyTo(numberArray2, numbers.Count); // CopyTo() foreach (var n in numberArray2) Console.Write(n + " ");执行结果为:
three two one
three two one