C#常用数据结构栈的介绍

news2024/11/24 17:32:07

       定义

        在C#中,Stack<T> 是一个后进先出(LIFO,Last-In-First-Out)集合类,位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶,并从栈顶弹出元素。

        不难看出,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除

        即有泛型版本,又有非泛型版本,我们常用泛型版本(二者思想上差别不大,非泛型会涉及装箱拆箱),栈的结构如下

常规用法

1. 声明一个栈

无参构造函数

获取一个空的栈对象

public Stack();

Stack<int> stack = new Stack<int>();

接受一个可枚举对象

        此构造函数允许你用一个已有的集合(如数组、列表等)来初始化栈,并按集合的顺序将元素压入栈中,集合的最后一个元素将成为栈的顶部。

public Stack(IEnumerable<T> collection);

List<int> list = new List<int> { 1, 2, 3 };
Stack<int> stack = new Stack<int>(list);

不常用

        指定栈的初始容量,减少扩展时的性能开销。这个参数不是常用的,因为栈会自动调整大小,但对于需要明确控制内存的场景,可以使用这个构造函数。

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 会移除并返回栈顶的元素。
因为是后进先出,所以我们弹出的最后入栈的元素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 遍历栈中的元素,注意遍历的顺序是从栈顶到栈底。

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 方法用于将内部存储的容量调整到栈中实际元素的数量。
栈动态调整大小时,可能会预留一些额外的空间。
此方法通过移除额外的空间来优化内存使用。

stack.TrimExcess(); // 移除多余的容量,减少内存浪费

11. CopyTo 方法

注意是一个浅拷贝方法

将栈中的元素复制到一个数组中,且从指定的数组索引位置开始放置。元素顺序是从栈顶到栈底.


Stack<MyClass> stack = new Stack<MyClass>();
stack.Push(new MyClass { Value = 1 });
stack.Push(new MyClass { Value = 2 });

MyClass[] array = new MyClass[stack.Count];
//传入需要复制的数组,第二个参数是目标数组中开始复制的索引位置
//栈中的第一个元素会被复制到目标数组的该索引位置,后续的栈元素将按顺序依次复制到数组的后续位置。
stack.CopyTo(array, 0);


// 修改数组中的对象
array[0].Value = 100;

// 栈中的对象也会反映这个修改
Console.WriteLine(stack.Peek().Value);  // 输出 100

12. ToArray 方法

注意是一个浅拷贝方法

将栈中的所有元素复制到一个新的数组中
会返回一个包含栈所有元素的新数组。栈中的元素会以 LIFO(后进先出)的顺序放入数组中,
也就是说,栈顶的元素会成为数组的第一个元素,栈底的元素会成为数组的最后一个元素。

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()

{

// 创建一个栈

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片如何转化为pdf格式?这几种方法超好用!

图片如何转化为pdf格式&#xff1f;在日常工作与学习中&#xff0c;图片与PDF文件作为两种截然不同的文档格式&#xff0c;各自扮演着重要角色&#xff0c;图片以其直观性著称&#xff0c;能够瞬间捕捉并展示视觉信息&#xff0c;无需额外软件即可快速浏览&#xff0c;但其内容…

免费制作证件照的小程序源码

1、效果展示 证件照制作&#xff0c;证件照免费制作&#xff0c;证件照调用api源码&#xff0c;解析代码。证件照制作小程序包&#xff0c;可以下载程序包&#xff0c;最初级版本免费下载。以上是高级版本。如果你有开发能力的话可以自己写前端&#xff0c;然后以下调用以下api…

粉丝精准!小红书卖儿童绘本项目,单月变现近2w(附详细教程)

AI绘本故事以其创新性、个性化、互动性和教育意义&#xff0c;迎合了宝爸宝妈对高质量儿童读物的需求&#xff0c;同时融合科技与教育&#xff0c;满足了他们对孩子全面发展的期待&#xff0c;因此在小红书上备受追捧。 今天给大家分享一个【小红书卖儿童绘本】项目&#xff0…

Spring Boot使用注解方式整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot使用注解方式整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工…

如何保持测试环境的稳定性?

日常自动化测试中最担心的就是环境不稳定问题。不稳定的测试环境&#xff0c;经常可能导致测试失败。 解决方法&#xff1a;尽量保持测试环境的稳定性&#xff0c;包括硬件、软件和网络等方面。 如何保持测试环境的稳定性&#xff1f; 要保持测试环境的稳定性&#xff0c;可…

从零开始,Docker进阶之路(二):Docker安装

Docker 要求 CentOS7 系统的内核版本在 3.10以上 1.通过 uname -r 命令查看你当前的内核版本 uname -r2. 使用 root 权限登录 Centos。确保 yum 包更新到最新。 yum -y update 慢慢等&#xff0c;小编也是等了十分钟之久 3.卸载旧版本(如果安装过旧版本的话) yum remove do…

元宇宙的未来趋势:Web3的潜在影响

元宇宙&#xff0c;一个日益受到关注的概念&#xff0c;代表着一个沉浸式的虚拟世界&#xff0c;其中用户可以进行社交、商业和娱乐活动。随着技术的发展&#xff0c;Web3逐渐成为推动元宇宙演变的重要力量。Web3以去中心化为核心&#xff0c;利用区块链、智能合约和其他创新技…

加密软件巅峰对决:Ping32 vs 天锐绿盾,谁是企业数据安全的守护者之王?

在信息安全日益重要的今天&#xff0c;企业加密软件已成为保护敏感数据的关键工具。在众多加密产品中&#xff0c;Ping32与天锐绿盾&#xff08;简称绿盾&#xff09;凭借其卓越的性能和丰富的功能&#xff0c;成为了企业用户关注的焦点。那么&#xff0c;在这场加密软件的巅峰…

干货分享 | TSMaster—LIN 唤醒与休眠机制

在汽车总线中常见的唤醒方式有硬线唤醒、网络唤醒和特定信号唤醒&#xff0c;而LIN总线则是通过休眠帧与唤醒电平来实现的&#xff0c;本文将介绍LIN的唤醒与休眠机制。 本文关键词&#xff1a;LIN 网络管理&#xff0c;休眠&#xff0c;唤醒 目录 Catalog 1. 网络管理 2. …

vue3开发中易遗漏的常见知识点

文章目录 组件样式的特性Scoped CSS之局部样式的泄露Scoped CSS之深度选择器CSS Modules在CSS中使用v-bind 非props属性继承组件通信父子组件的相互通信props/$emit父组件传递数据给子组件子组件传递数据给父组件 非父子组件的相互通信Provide/inject全局事件总线 组件插槽作用…

用Python与OpenCV的实践:实时面部对称性分析

目录 思路分析 整体代码 效果展示 总结 在当今计算机视觉领域&#xff0c;人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用&#xff0c;还是美学研究&#xff0c;人脸特征的提取和分析都是关键技术之一。在这篇博客中&#xff0c;我们将深入探讨一个有趣的…

Arco HomeMenu - 无入侵式的个性化菜单配置插件

关于 Arco HomeMenu Arco HomeMenu 插件是一款对 odoo 菜单功能的增强工具&#xff0c;它的主要功能是允许用户个性化菜单收藏。主要通过分类文件夹及布局功能实现。 Arco HomeMenu 插件主要用于优化用户在 odoo 系统中的操作体验。通过插件功能&#xff0c;用户可以根据自己的…

innovus:如何报告SI

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 报告SI首先要设置si aware,报

79、Python之鸭子类型:没有听过鸭子类型?关键在于认知的转变

引言 不同于Java等静态类型的语言&#xff0c;Python基于动态类型系统的设计理念&#xff0c;使得Python在很多应用场景中&#xff0c;显得更急灵活、高效。而在动态类型系统中&#xff0c;有一个很重要的概念&#xff0c;就是“鸭子类型”。鸭子类型的背后&#xff0c;代表的…

一地通过率高达46.43%!为什么都说软考难?

从2023年上半年到2024年上半年&#xff0c;近三次考试&#xff0c;几个考区的软考通过率基本不超过13%。 然而根据近日陕西省科技资源统筹中心公布的数据&#xff0c;从1987年到2024年&#xff0c;陕西软考的总拿证率竟然高达46.43%。软考真的有大家认为的那么难吗&#xff1f;…

Unity场景内画车道线(根据五阶曲线系数)

之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位&#xff0c;根据点位来进行构建。 由于AI识别出来的点位不线性&#xff0c;画出来的车道线经常是歪七扭八&#xff0c;所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建&#xff0c;公式…

DATEDIF 函数用不了?DATEDIF函数怎么用我来告诉你

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4c5; 在处理与时间相关的数据时&#xff0c;DATEDIF函数是Excel中一个非常有用的工具。DATEDIF函数可以计算两个日期之间的差异&#xff0c;无论是天数、月数还是年数。这在处理年龄计算、工龄统计或任何需要日期差…

大健康管理系统|健康综合咨询问诊平台设计与实现(源码+数据库+文档)

大健康管理系统目录 目录 健康综合咨询问诊平台设计与实现 一、前言 二、系统功能设计 三、系统实现 5.1用户信息管理 5.2 医生信息管理 5.3科室信息管理 5.1新闻信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文…

docker笔记_数据卷、挂载

docker数据存储 概述数据卷&#xff08;Volumes&#xff09;特点操作 绑定挂载&#xff08;Bind Mounts&#xff09;内存挂载&#xff08;tmpfs&#xff09;总结 概述 镜像构建过程中&#xff0c;所产生的layer都是只读层&#xff0c;只有在创建容器时才会生成一个可写的容器层…

鸿蒙OpenHarmony【小型系统基础内核(虚拟内存管理)】子系统开发

虚拟内存管理 基本概念 虚拟内存管理是计算机系统管理内存的一种技术。每个进程都有连续的虚拟地址空间&#xff0c;虚拟地址空间的大小由CPU的位数决定&#xff0c;32位的硬件平台可以提供的最大的寻址空间为0-4GiB。整个4GiB空间分成两部分&#xff0c;LiteOS-A内核占据3Gi…