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

       定义

        在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 会移除并返回栈顶的元素。
因为是后进先出,所以我们弹出的最后入栈的元素3int 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.mzph.cn/bicheng/54924.shtml

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

相关文章

Vue引入js脚本问题记录(附解决办法)

目录 一、需求 二、import引入问题记录 三、解决方式 一、需求 我想在我的Vue项目中引入jquery.js和bootstrap.js这种脚本文件&#xff0c;但发现不能单纯的import引入&#xff0c;问题如下。 二、import引入问题记录 我直接这么引入&#xff0c;发现控制台报错TypeError: …

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等&#xff0c;并可以通过信息窗口展示详细信息。 点注释支持功能&#xff1a; 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格&#xff0c;同时也支持自定…

《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch9 策略梯度方法 Box 8.1 马尔可夫决策过程的平稳分布

Box 8.1&#xff1a; 马尔可夫决策过程的平稳分布 整理自 链接 分析平稳分布的关键工具是 P π ∈ R n n P_\pi \in {\mathbb R}^{n\times n} Pπ​∈Rnn&#xff0c;它是给定策略 π π π 下的概率转移矩阵。 如果状态被索引为 s 1 , ⋯ , s n s_1,\cdots, s_n s1​,⋯…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…

图片尺寸不合适?这3款免费好用的AI绘图神器帮你免费无缝拓展!一键扩展画面之外的内容,真的泰裤啦!

大家好&#xff0c;我是灵魂画师向阳 在处理图片素材时&#xff0c;大家有没有遇到过尺寸不合适但又不能裁切的情况&#xff1f;是不是也想过图像要是能自己“长”出一块就好了&#xff1f;这种要求在以前或许很难实现&#xff0c;但生产式 AI 技术出现后它就不再是问题了&…

基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue

基于GIKT深度知识追踪模型的习题推荐系统 目录结构 Flask-BackEnd flask后端 app 后端主体文件 alg 深度学习模块 data 数据集data_process.py 数据预处理gikt.py GIKT模型pebg.py PEBG模型params.py 一些参数train.py 仅模型训练train_test.py 模型训练和测试-五折交叉验证t…

WebGIS开发四大开源框架对比

本篇文章主要介绍GIS开发四大地图框架的差异和特点。 Cesium: Cesium是目前主流的一款三维地图框架&#xff0c;支持桌面端、web端、移动端等多平台。Mapbox&#xff1a;高清经纬度矢量瓦片&#xff0c;个性化前端表达&#xff0c;前端矢量绘制&#xff0c;支持海量地名地址。…

数据库实验2—1

10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名称…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境&#xff0c;读取一个配置文件&#xff0c;并把配置文件简单解析了一下。 前面读取配置文件&#xff0c;使用File.readFrom()&#xff0c;这个直接把文件全部读取出来&#xff0c;返回一个字节数组。然后又创建一个字节流&#xff0c;给文件…

C语言实现常见的数据结构

栈 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构 #include <stdio.h> #include <stdlib.h>#define MAX 100typedef struct {int data[MAX];int top; } Stack;// 初始化栈 void init(Stack *s) {s->top -1; }// 判断栈是否为空…

VBA技术资料MF204:右键多按钮弹出菜单中使用图标

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【python】【绘制小程序】动态爱心绘制

背景介绍 参考链接&#xff1a;https://blog.csdn.net/Python_HUHU/article/details/139703289点的背景颜色在开始修改&#xff1b;文字的颜色在最后修改。文字内容可以修改。 python 代码 import tkinter as tk import random from math import sin, cos, pi, log from PIL…

Cocos 3.8.3 实现外描边效果(逃课玩法)

本来想着用Cocos 的Shader Graph照搬Unity的思路来加外描边&#xff0c;发现不行&#xff0c;然后我就想弄两个物体不就行了吗&#xff0c;一个是放大的版本&#xff0c;再放大的版本上加一个材质&#xff0c;这个材质面剔除选择前面的面剔除就行了&#xff0c;果不其然还真行。…

如何使用ssm实现基于java web的防疫工作志愿者服务平台的设计与实现

TOC ssm693基于java web的防疫工作志愿者服务平台的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

详细解读,F5服务器负载均衡的技术优势

在现代大规模、高流量的网络使用场景中&#xff0c;为应对高并发和海量数据的挑战&#xff0c;服务器负载均衡技术应运而生。但凡知道服务器负载均衡这一名词的&#xff0c;基本都对F5有所耳闻&#xff0c;因为负载均衡正是F5的代表作&#xff0c;换句通俗易懂的话来说&#xf…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…

基于springboot的驾校预约管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的驾校预约管理系统5拥有三种角色&#xff1a;管理员、教练、学员 管理员&#xff1a;学员管理、教练管理、车辆管理、车辆关联、维修管理等 教练&#xff1a;学员查看/毕…

再次重温 Spring 中 Bean 的生命周期

Bean的生命周期 Spring中的bean的生命周期主要包含四个阶段&#xff1a;实例化Bean --&#xff1e; Bean属性填充 --&#xff1e; 初始化Bean --&#xff1e;销毁Bean 首先是实例化Bean&#xff0c;当客户向容器请求一个尚未初始化的bean时&#xff0c;或初始化bean的时候需要…

hive-拉链表

目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息&#xff0c;比如用户手机号码信息。然而随着时间的变化&#xff0c;某些用户信息会发生改…

SpringSecurity-用户认证

1、用户认证 1.1 用户认证核心组件 我们系统中会有许多用户&#xff0c;确认当前是哪个用户正在使用我们系统就是登录认证的最终目的。这里我们就提取出了一个核心概念&#xff1a;当前登录用户/当前认证用户。整个系统安全都是围绕当前登录用户展开的&#xff0c;这个不难理…