网站首页 > 技术文章 正文
C# 集合
在 C# 中,堆栈(Stack) 是一种后进先出(LIFO, Last In First Out)的数据结构。
堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。
堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。
Stack 提供了两种实现方式:
非泛型 Stack(System.Collections.Stack):支持存储任何类型的对象(需要装箱和拆箱操作)。
泛型 Stack<T>(
System.Collections.Generic.Stack<T>):支持强类型对象,避免装箱和拆箱,提高性能。
Stack 特性:
后进先出:最后压入堆栈的元素最先弹出。
动态大小:堆栈的容量根据需要动态调整。
泛型支持:通过 Stack<T> 提供类型安全,避免类型转换错误。
非线程安全:默认 Stack 和 Stack<T> 都不是线程安全的。
Stack 类的方法和属性
下表列出了 Stack 类的一些常用的 属性:
属性名称 类型 描述
Count int 获取堆栈中的元素个数。
SyncRoot object 获取一个对象,用于同步对堆栈的访问(非泛型)。
IsSynchronized bool 指示堆栈的访问是否同步(线程安全,始终为 false)。
获取 Stack 中包含的元素个数。 下表列出了 Stack 类的一些常用的 方法:
方法名称 返回类型 描述
Push(object item) void 将元素压入堆栈的顶部。
Pop() object 移除并返回堆栈顶部的元素。
Peek() object 返回堆栈顶部的元素,但不移除。
Clear() void 移除堆栈中的所有元素。
Contains(object item) bool 确定某元素是否存在于堆栈中。
ToArray() object[] 将堆栈中的元素复制到新数组中(顺序翻转)。
Clone() object 创建当前堆栈的浅表副本。
CopyTo(Array array, int index) void 将堆栈中的元素复制到现有数组,从指定索引开始。
GetEnumerator() IEnumerator 返回一个枚举器,用于循环访问堆栈中的元素。
Synchronized(Stack stack) Stack 返回一个线程安全的堆栈包装器。
实例
下面的实例演示了堆栈(Stack)的使用。
非泛型堆栈:
实例
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Stack st = new Stack();
st.Push('A');
st.Push('M');
st.Push('G');
st.Push('W');
Console.WriteLine("Current stack: ");
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.WriteLine();
st.Push('V');
st.Push('H');
Console.WriteLine("The next poppable value in stack: {0}",
st.Peek());
Console.WriteLine("Current stack: ");
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.WriteLine();
Console.WriteLine("Removing values ");
st.Pop();
st.Pop();
st.Pop();
Console.WriteLine("Current stack: ");
foreach (char c in st)
{
Console.Write(c + " ");
}
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Current stack:
W G M A
The next poppable value in stack: H
Current stack:
H V W G M A
Removing values
Current stack:
G M A
泛型堆栈:
实例
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack<int> stack = new Stack<int>();
// 压栈
stack.Push(10);
stack.Push(20);
stack.Push(30);
// 查看堆栈顶部
Console.WriteLine(#34;Peek: {stack.Peek()}"); // 输出:30
// 弹栈
Console.WriteLine(#34;Pop: {stack.Pop()}"); // 输出:30
// 剩余堆栈
Console.WriteLine("Remaining items:");
foreach (var item in stack)
{
Console.WriteLine(item); // 输出:20, 10
}
}
}
Stack 与 Stack<T> 区别
Stack(非泛型)
存储对象为 object 类型。
使用时需要显式类型转换,可能会导致运行时异常。
Stack<T>(泛型)
提供类型安全,避免类型转换问题。
性能更优,因为避免了装箱和拆箱的开销。
- 上一篇: 拍风光常提到的“堆栈法”是什么意思?
- 下一篇: 摄影教程|如何进行堆栈操作?(摄影中堆栈是什么意思)
猜你喜欢
- 2025-07-18 C语言内存分布(内核区、堆栈区等)
- 2025-07-18 NDK打印调用堆栈(java 打印调用堆栈)
- 2025-07-18 还有多少人搞不懂堆内存和栈内存的区别?
- 2025-07-18 微软为Windows 10版本1903推出了新的服务堆栈
- 2025-07-18 浅析Cortex-M系统堆栈机制(堆栈式exmor rs cmos)
- 2025-07-18 使用Photoshop做最简单快捷的“堆栈”风光秀
- 2025-07-18 [小C图述馆]拍照控们知道堆栈式和背照式手机摄像头的区别吗?
- 2025-07-18 详解STM32单片机的堆栈(stm32f4 堆栈空间)
- 2025-07-18 130.C# Stack 堆栈(c#堆栈溢出)
- 2025-07-18 全传感器读出速度表格分享,看看堆栈/部分堆栈到底有多强?
- 最近发表
-
- Qt编程进阶(63):Qt Quick高级控件的使用
- Qt编程进阶(47):QML鼠标事件处理(qt编程难不难)
- 使用Xamarin和Visual Studio开发Android可穿戴设备应用
- Qt使用教程:创建Qt Quick应用程序(三)
- QML性能优化 | 常见界面元素优化(qml布局自适应大小)
- Qt使用教程:创建移动应用程序(二)
- Qt Quick 多媒体开发播放音乐和视频
- Qt使用教程:创建Qt Quick UI表单(三)
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
- QML控件:TextInput, TextField, TextEdit, TextArea用法及自定义
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- nfs (25)
- springbatch (28)
- oracle数据库备份 (25)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- c 数组 (33)
- pascal语言教程 (23)
- ppt 教程 (35)
- java7 (24)
- 自适应网站制作 (32)
- server服务自动停止 (25)
- 超链接去掉下划线 (34)
- 什么是堆栈 (22)
- map entry (25)
- ubuntu装qq (25)
- outputstreamwriter (26)
- fill_parent (22)