首页 > 编程笔记 > C#笔记 阅读:7

C# Stack用法详解(附带实例)

栈是一个线性的数据结构,特色是由下往上堆放数据,如下所示:


将数据插入栈的动作称为推入(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

相关文章