C#常用數(shù)據(jù)結構棧的詳細介紹
定義
在C#中,Stack<T> 是一個后進先出(LIFO,Last-In-First-Out)集合類,位于System.Collections.Generic 命名空間中。Stack<T> 允許你將元素壓入棧頂,并從棧頂彈出元素。
不難看出,最先放入棧中的元素在棧底,最后放入的元素在棧頂,而刪除元素剛好相反,最后放入的元素最先刪除,最先放入的元素最后刪除
即有泛型版本,又有非泛型版本,我們常用泛型版本(二者思想上差別不大,非泛型會涉及裝箱拆箱),棧的結構如下
常規(guī)用法
1. 聲明一個棧
無參構造函數(shù)
獲取一個空的棧對象
public Stack(); Stack<int> stack = new Stack<int>();
接受一個可枚舉對象
此構造函數(shù)允許你用一個已有的集合(如數(shù)組、列表等)來初始化棧,并按集合的順序將元素壓入棧中,集合的最后一個元素將成為棧的頂部。
public Stack(IEnumerable<T> collection); List<int> list = new List<int> { 1, 2, 3 }; Stack<int> stack = new Stack<int>(list);
不常用
指定棧的初始容量,減少擴展時的性能開銷。這個參數(shù)不是常用的,因為棧會自動調整大小,但對于需要明確控制內存的場景,可以使用這個構造函數(shù)。
public Stack(int capacity); Stack<int> stack = new Stack<int>(100); // 初始化一個容量為100的棧
2. 將元素壓入棧 (Push)
stack.Push(1); stack.Push(2); stack.Push(3);
3. 從棧頂彈出元素 (Pop)
Pop 會移除并返回棧頂?shù)脑亍? 因為是后進先出,所以我們彈出的最后入棧的元素3 int topElement = stack.Pop(); // topElement is 3
4. 查看棧頂元素但不移除 (Peek)
Peek 只返回棧頂元素,但不會從棧中移除它。 int topElement = stack.Peek(); // topElement is 2
5. 檢查棧是否為空 (Count 和 Any)
你可以使用 Count 屬性或 Any 方法來檢查棧中是否有元素。 bool isEmpty = stack.Count == 0; // or stack.Any() == false
6. 遍歷棧中的元素
你可以通過 foreach 遍歷棧中的元素,注意遍歷的順序是從棧頂?shù)綏5住? foreach (var item in stack) { Console.WriteLine(item); }
7. 清空棧 (Clear)
你可以使用 Clear 方法來移除棧中的所有元素。 stack.Clear();
8.Contains 方法
判斷棧中是否包含某個元素,返回 true 或 false。 bool exists = stack.Contains(2); // 檢查棧中是否包含2
9.TryPeek 和 TryPop 方法
TryPeek(out T result) TryPeek 允許你嘗試獲取棧頂元素,而不會拋出異常。如果棧為空,它返回 false,否則返回 true 并輸出棧頂元素。 if (stack.TryPeek(out int topElement)) { Console.WriteLine($"Top element: {topElement}"); } else { Console.WriteLine("Stack is empty"); }
TryPop(out T result) TryPop 允許你嘗試彈出棧頂元素,同樣不會拋出異常。如果棧為空,它返回 false,否則返回 true 并輸出并移除棧頂元素。 if (stack.TryPop(out int poppedElement)) { Console.WriteLine($"Popped element: {poppedElement}"); } else { Console.WriteLine("Stack is empty"); }
使用頻率較低的方法 10.TrimExcess 方法
TrimExcess 方法用于將內部存儲的容量調整到棧中實際元素的數(shù)量。 棧動態(tài)調整大小時,可能會預留一些額外的空間。 此方法通過移除額外的空間來優(yōu)化內存使用。 stack.TrimExcess(); // 移除多余的容量,減少內存浪費
11. CopyTo 方法
注意是一個淺拷貝方法
將棧中的元素復制到一個數(shù)組中,且從指定的數(shù)組索引位置開始放置。元素順序是從棧頂?shù)綏5? Stack<MyClass> stack = new Stack<MyClass>(); stack.Push(new MyClass { Value = 1 }); stack.Push(new MyClass { Value = 2 }); MyClass[] array = new MyClass[stack.Count]; //傳入需要復制的數(shù)組,第二個參數(shù)是目標數(shù)組中開始復制的索引位置 //棧中的第一個元素會被復制到目標數(shù)組的該索引位置,后續(xù)的棧元素將按順序依次復制到數(shù)組的后續(xù)位置。 stack.CopyTo(array, 0); // 修改數(shù)組中的對象 array[0].Value = 100; // 棧中的對象也會反映這個修改 Console.WriteLine(stack.Peek().Value); // 輸出 100
12. ToArray 方法
注意是一個淺拷貝方法
將棧中的所有元素復制到一個新的數(shù)組中 會返回一個包含棧所有元素的新數(shù)組。棧中的元素會以 LIFO(后進先出)的順序放入數(shù)組中, 也就是說,棧頂?shù)脑貢蔀閿?shù)組的第一個元素,棧底的元素會成為數(shù)組的最后一個元素。 Stack<int> stack = new Stack<int>(); stack.Push(1); stack.Push(2); stack.Push(3); int[] array = stack.ToArray(); foreach (var item in array) { Console.WriteLine(item); }
一個完整示例
using System; using System.Collections.Generic; class Program { static void Main() { // 創(chuàng)建一個棧 Stack<string> stack = new Stack<string>(); // 向棧中添加元素 stack.Push("First"); stack.Push("Second"); stack.Push("Third"); // 查看棧頂元素(不移除) Console.WriteLine("Peek: " + stack.Peek()); // 彈出棧頂元素 Console.WriteLine("Pop: " + stack.Pop()); // 再次查看棧頂元素 Console.WriteLine("Peek after pop: " + stack.Peek()); // 遍歷棧 Console.WriteLine("Stack contents:"); foreach (var item in stack) { Console.WriteLine(item); } // 檢查棧是否為空 Console.WriteLine("Is stack empty? " + (stack.Count == 0)); // 清空棧 stack.Clear(); Console.WriteLine("Stack cleared. Is stack empty? " + (stack.Count == 0)); } }
輸出結果
Peek: Third
Pop: Third
Peek after pop: Second
Stack contents:
Second
First
Is stack empty? False
Stack cleared. Is stack empty? True
到此這篇關于C#常用數(shù)據(jù)結構棧的介紹的文章就介紹到這了,更多相關C#數(shù)據(jù)結構棧內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Winform中GridView分組排序功能實現(xiàn)方法
這篇文章主要介紹了Winform中GridView分組排序功能實現(xiàn)方法,以實例形式詳細說明了分組排序的實現(xiàn)方法,并附帶完整的DBHelp類代碼,是非常實用的技巧,需要的朋友可以參考下2014-11-11C#、ASP.NET通用工具類IsWhat?(可以判斷數(shù)字、身份證、數(shù)據(jù)類型等等)
這篇文章主要介紹了C#、ASP.NET通用工具類IsWhat?(可以判斷數(shù)字、身份證、數(shù)據(jù)類型等等),本文收集整理了多個擴展函數(shù),簡單實用,項目必備,如值范圍、在里面嗎、是null或""?、是零?等等,需要的朋友可以參考下2015-06-06C#使用AnimateWindow()實現(xiàn)動畫窗體的方法
用API函數(shù)AnimateWindow函數(shù)來實現(xiàn)窗體的動畫效果,在C#中,你可以使用P/Invoke技術調用Windows API中的AnimateWindow函數(shù)來實現(xiàn)動畫窗體,本文就給大家介紹了C#使用AnimateWindow()實現(xiàn)動畫窗體的方法,感興趣的朋友可以參考下2024-04-04C# winfrom 模擬ftp文件管理實現(xiàn)代碼
從網上找到的非常好用的模擬ftp管理代碼,整理了一下,希望對需要的人有幫助2014-01-01