C#常用數(shù)據(jù)結(jié)構(gòu)棧的詳細(xì)介紹
定義
在C#中,Stack<T> 是一個(gè)后進(jìn)先出(LIFO,Last-In-First-Out)集合類,位于System.Collections.Generic 命名空間中。Stack<T> 允許你將元素壓入棧頂,并從棧頂彈出元素。

不難看出,最先放入棧中的元素在棧底,最后放入的元素在棧頂,而刪除元素剛好相反,最后放入的元素最先刪除,最先放入的元素最后刪除
即有泛型版本,又有非泛型版本,我們常用泛型版本(二者思想上差別不大,非泛型會(huì)涉及裝箱拆箱),棧的結(jié)構(gòu)如下

常規(guī)用法
1. 聲明一個(gè)棧
無(wú)參構(gòu)造函數(shù)
獲取一個(gè)空的棧對(duì)象
public Stack(); Stack<int> stack = new Stack<int>();
接受一個(gè)可枚舉對(duì)象
此構(gòu)造函數(shù)允許你用一個(gè)已有的集合(如數(shù)組、列表等)來(lái)初始化棧,并按集合的順序?qū)⒃貕喝霔V校系淖詈笠粋€(gè)元素將成為棧的頂部。
public Stack(IEnumerable<T> collection);
List<int> list = new List<int> { 1, 2, 3 };
Stack<int> stack = new Stack<int>(list);不常用
指定棧的初始容量,減少擴(kuò)展時(shí)的性能開(kāi)銷(xiāo)。這個(gè)參數(shù)不是常用的,因?yàn)闂?huì)自動(dòng)調(diào)整大小,但對(duì)于需要明確控制內(nèi)存的場(chǎng)景,可以使用這個(gè)構(gòu)造函數(shù)。
public Stack(int capacity); Stack<int> stack = new Stack<int>(100); // 初始化一個(gè)容量為100的棧
2. 將元素壓入棧 (Push)
stack.Push(1); stack.Push(2); stack.Push(3);
3. 從棧頂彈出元素 (Pop)
Pop 會(huì)移除并返回棧頂?shù)脑亍? 因?yàn)槭呛筮M(jìn)先出,所以我們彈出的最后入棧的元素3 int topElement = stack.Pop(); // topElement is 3
4. 查看棧頂元素但不移除 (Peek)
Peek 只返回棧頂元素,但不會(huì)從棧中移除它。 int topElement = stack.Peek(); // topElement is 2
5. 檢查棧是否為空 (Count 和 Any)
你可以使用 Count 屬性或 Any 方法來(lái)檢查棧中是否有元素。 bool isEmpty = stack.Count == 0; // or stack.Any() == false
6. 遍歷棧中的元素
你可以通過(guò) foreach 遍歷棧中的元素,注意遍歷的順序是從棧頂?shù)綏5住?
foreach (var item in stack)
{
Console.WriteLine(item);
}7. 清空棧 (Clear)
你可以使用 Clear 方法來(lái)移除棧中的所有元素。 stack.Clear();
8.Contains 方法
判斷棧中是否包含某個(gè)元素,返回 true 或 false。 bool exists = stack.Contains(2); // 檢查棧中是否包含2
9.TryPeek 和 TryPop 方法
TryPeek(out T result)
TryPeek 允許你嘗試獲取棧頂元素,而不會(huì)拋出異常。如果棧為空,它返回 false,否則返回 true 并輸出棧頂元素。
if (stack.TryPeek(out int topElement))
{
Console.WriteLine($"Top element: {topElement}");
}
else
{
Console.WriteLine("Stack is empty");
}TryPop(out T result)
TryPop 允許你嘗試彈出棧頂元素,同樣不會(huì)拋出異常。如果棧為空,它返回 false,否則返回 true 并輸出并移除棧頂元素。
if (stack.TryPop(out int poppedElement))
{
Console.WriteLine($"Popped element: {poppedElement}");
}
else
{
Console.WriteLine("Stack is empty");
}使用頻率較低的方法 10.TrimExcess 方法
TrimExcess 方法用于將內(nèi)部存儲(chǔ)的容量調(diào)整到棧中實(shí)際元素的數(shù)量。 棧動(dòng)態(tài)調(diào)整大小時(shí),可能會(huì)預(yù)留一些額外的空間。 此方法通過(guò)移除額外的空間來(lái)優(yōu)化內(nèi)存使用。 stack.TrimExcess(); // 移除多余的容量,減少內(nèi)存浪費(fèi)
11. CopyTo 方法
注意是一個(gè)淺拷貝方法
將棧中的元素復(fù)制到一個(gè)數(shù)組中,且從指定的數(shù)組索引位置開(kāi)始放置。元素順序是從棧頂?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];
//傳入需要復(fù)制的數(shù)組,第二個(gè)參數(shù)是目標(biāo)數(shù)組中開(kāi)始復(fù)制的索引位置
//棧中的第一個(gè)元素會(huì)被復(fù)制到目標(biāo)數(shù)組的該索引位置,后續(xù)的棧元素將按順序依次復(fù)制到數(shù)組的后續(xù)位置。
stack.CopyTo(array, 0);
// 修改數(shù)組中的對(duì)象
array[0].Value = 100;
// 棧中的對(duì)象也會(huì)反映這個(gè)修改
Console.WriteLine(stack.Peek().Value); // 輸出 10012. ToArray 方法
注意是一個(gè)淺拷貝方法
將棧中的所有元素復(fù)制到一個(gè)新的數(shù)組中
會(huì)返回一個(gè)包含棧所有元素的新數(shù)組。棧中的元素會(huì)以 LIFO(后進(jìn)先出)的順序放入數(shù)組中,
也就是說(shuō),棧頂?shù)脑貢?huì)成為數(shù)組的第一個(gè)元素,棧底的元素會(huì)成為數(shù)組的最后一個(gè)元素。
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);
}一個(gè)完整示例
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 創(chuàng)建一個(gè)棧
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));
}
}輸出結(jié)果
Peek: Third
Pop: Third
Peek after pop: Second
Stack contents:
Second
First
Is stack empty? False
Stack cleared. Is stack empty? True
到此這篇關(guān)于C#常用數(shù)據(jù)結(jié)構(gòu)棧的介紹的文章就介紹到這了,更多相關(guān)C#數(shù)據(jù)結(jié)構(gòu)棧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#的靜態(tài)工廠方法與構(gòu)造函數(shù)相比有哪些優(yōu)缺點(diǎn)
這篇文章主要介紹了C#的靜態(tài)工廠方法與構(gòu)造函數(shù)對(duì)比的優(yōu)缺點(diǎn),文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C#3.0使用EventLog類寫(xiě)Windows事件日志的方法
這篇文章主要介紹了C#3.0使用EventLog類寫(xiě)Windows事件日志的方法,以簡(jiǎn)單實(shí)例形式分析了C#寫(xiě)windows事件日志的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
c#中WinForm使用OpencvSharp4實(shí)現(xiàn)簡(jiǎn)易抓邊
本文主要介紹了c#中WinForm使用OpencvSharp4實(shí)現(xiàn)簡(jiǎn)易抓邊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
C# WinForm調(diào)用net core實(shí)現(xiàn)文件上傳接口
這篇文章主要為大家詳細(xì)介紹了C# WinForm如何調(diào)用net core實(shí)現(xiàn)文件上傳接口,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
C#保存圖片到數(shù)據(jù)庫(kù)并讀取顯示圖片的方法
將圖像保存到SQL server2000的Image字段中2013-04-04
C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-03-03
C#創(chuàng)建數(shù)據(jù)庫(kù)及導(dǎo)入sql腳本的方法
這篇文章主要介紹了C#創(chuàng)建數(shù)據(jù)庫(kù)及導(dǎo)入sql腳本的方法,涉及C#針對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建、連接、導(dǎo)入等相關(guān)操作技巧,需要的朋友可以參考下2015-12-12

