C# 堆栈(Stack)

本文介绍了堆栈(Stack)的概念,作为一种后进先出(LIFO)的数据结构,堆栈支持两种主要的操作:推入(将元素添加到列表中)和弹出(从列表中移除元素)。理解这些基本概念对于掌握数据结构的应用至关重要。
C# 中,堆栈(`Stack<T>`)是一种后进先出(LIFO, Last-In-First-Out)的数据结构,它广泛用于算法、程序调用管理、表达式求值、回溯机制等场景。`System.Collections.Generic` 命名空间提供了泛型 `Stack<T>` ,它基于动态数组实现,具有高效的入栈(Push)和出栈(Pop)操作。 ### 使用指南 #### 1. 声明与初始化 ```csharp Stack<int> stack = new Stack<int>(); ``` 也可以指定初始容量: ```csharp Stack<string> stack = new Stack<string>(10); ``` #### 2. 基本操作 - **Push**:将元素压入栈顶 ```csharp stack.Push(100); ``` - **Pop**:移除并返回栈顶元素,若栈为空会抛出异常 ```csharp int top = stack.Pop(); ``` - **Peek**:查看栈顶元素但不移除 ```csharp int top = stack.Peek(); ``` - **Contains**:判断栈中是否包含某个元素 ```csharp bool exists = stack.Contains(50); ``` - **Count**:获取当前栈中元素个数 ```csharp int size = stack.Count; ``` - **Clear**:清空栈 ```csharp stack.Clear(); ``` #### 3. 遍历栈 由于栈是 LIFO 结构,遍历时是按照从栈顶到栈底的顺序访问元素: ```csharp foreach (var item in stack) { Console.WriteLine(item); } ``` ### 实现原理 `Stack<T>` 的底层实现基于动态数组(`T[]`),其核心操作如下: - **Push**:将元素添加到数组末尾,若数组已满则进行扩容(通常是当前容量的两倍)[^2]。 - **Pop**:移除数组最后一个元素,并返回该元素值。 - **Peek**:返回数组最后一个元素而不移除。 - **扩容机制**:当内部数组空间不足时,会创建一个新的更大的数组,并将旧数据复制过去。 该实现方式使得 `Push` 和 `Pop` 操作的时间复杂度为 O(1),具有较高的性能[^2]。 ### 示例:使用栈实现括号匹配检查 ```csharp public bool IsBalanced(string input) { Stack<char> stack = new Stack<char>(); foreach (char c in input) { if (c == '(' || c == '[' || c == '{') { stack.Push(c); } else if (c == ')' || c == ']' || c == '}') { if (stack.Count == 0) return false; char top = stack.Pop(); if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) { return false; } } } return stack.Count == 0; } ``` ### 注意事项 - 使用 `Pop` 时应确保栈不为空,否则会抛出 `InvalidOperationException`。 - 若需线程安全的栈结构,可以使用 `ConcurrentStack<T>` 。 - 栈适用于递归模拟、状态回溯、表达式求值等场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值