数据结构C#版笔记--堆栈(Stack)

堆栈(Stack)最明显的特征就是“先进后出”,本质上讲堆栈也是一种线性结构,符合线性结构的基本特点:即每个节点有且只有一个前驱节点和一个后续节点。

相对前面学习过的顺序表、链表不同的地方在于:Stack把所有操作限制在"只能在线性结构的某一端"进行,而不能在中间插入或删除元素。下面是示意图:


从示意图中可以看出,堆栈有二种实现方式:基于数组的顺序堆栈实现、类似链表的链式堆栈实现

先抽象堆栈的接口IStack:

namespace 栈与队列
{public interface IStack<T>{/// <summary>/// 返回堆栈的实际元素个数/// </summary>/// <returns></returns>int Count();/// <summary>/// 判断堆栈是否为空/// </summary>/// <returns></returns>bool IsEmpty();/// <summary>/// 清空堆栈里的元素/// </summary>void Clear();/// <summary>/// 入栈:将元素压入堆栈中/// </summary>/// <param name="item"></param>void Push(T item);/// <summary>/// 出栈:从堆栈顶取一个元素,并从堆栈中删除/// </summary>/// <returns></returns>T Pop();/// <summary>/// 取堆栈顶部的元素(但不删除)/// </summary>/// <returns></returns>T Peek();}
}

顺序堆栈(SeqStack)的实现:

using System;
using System.Text;namespace 栈与队列
{public class SeqStack<T>:IStack<T>{private int maxsize;private T[] data;private int top;        public SeqStack(int size) {data = new T[size];maxsize = size;top = -1;}#region //接口实现部分public int Count() {return top + 1;}public void Clear() {top = -1;}public bool IsEmpty() {return top == -1;}public void Push(T item){if (IsFull()){Console.WriteLine("Stack is full");return;}data[++top] = item;}public T Pop(){T tmp = default(T);if (IsEmpty()){Console.WriteLine("Stack is empty");return tmp;}tmp = data[top];top--;return tmp;}public T Peek(){if (IsEmpty()){Console.WriteLine("Stack is empty!");return default(T);}return data[top];}#endregionpublic bool IsFull() {return top == maxsize - 1;}public override string ToString(){StringBuilder sb = new StringBuilder();for (int i = top;i>=0;i--){sb.Append(data[i] + ",");}return sb.ToString().Trim(',');}        }
}

链式堆栈(LinkStack)的实现

先定义节点Node.cs

namespace 栈与队列
{public class Node<T>{private T data;private Node<T> next;public Node(T data, Node<T> next) {this.data = data;this.next = next;}public Node(Node<T> next) {this.next = next;this.data = default(T);}public Node(T data) {this.data = data;this.next = null;}public Node() {this.data = default(T);this.next = null;}public T Data {get { return this.data; }set { this.data = value; }}public Node<T> Next {get { return next; }set { next = value; }}}
}

下面是LinkStack.cs

using System;
using System.Text;namespace 栈与队列
{public class LinkStack<T>:IStack<T>{private Node<T> top;private int num;//节点个数/// <summary>/// 顶部节点/// </summary>public Node<T> Top {get { return top; }set { top = value; }}public LinkStack() {top = null;num = 0;}public int Count() {return num;}public void Clear() {top = null;num = 0;}public bool IsEmpty() {if (top == null && num == 0){return true;}else {return false;}}public void Push(T item) {Node<T> q = new Node<T>(item);if (top == null){top = q;}else {q.Next = top;top = q;}num++;}public T Pop() {if (IsEmpty()) {Console.WriteLine("Stack is empty!");return default(T);}Node<T> p = top;top = top.Next;num--;return p.Data;}public T Peek() {if (IsEmpty()) {Console.WriteLine("Stack is empty!");return default(T);}return top.Data;}public override string ToString(){StringBuilder sb = new StringBuilder();if (top != null) {sb.Append(top.Data.ToString() + ",");Node<T> p = top;while (p.Next != null){                    sb.Append(p.Next.Data.ToString()+ ",");p = p.Next;}}return sb.ToString();}}
}

测试代码片段:

            Console.WriteLine("顺序堆栈测试开始...");SeqStack<int> seqStack = new SeqStack<int>(10);seqStack.Push(1);seqStack.Push(2);seqStack.Push(3);Console.WriteLine(seqStack);Console.WriteLine(seqStack.Peek());Console.WriteLine(seqStack);Console.WriteLine(seqStack.Pop());Console.WriteLine(seqStack);Console.WriteLine("链堆栈测试开始...");LinkStack<int> linkStack = new LinkStack<int>();linkStack.Push(1);linkStack.Push(2);linkStack.Push(3);Console.WriteLine(linkStack);Console.WriteLine(linkStack.Peek());Console.WriteLine(linkStack);Console.WriteLine(linkStack.Pop());Console.WriteLine(linkStack);Console.ReadLine();

.Net中System.Collections.Generic.Stack<T>已经提供了堆栈的基本实现,明白原理后,仍然推荐大家使用内置的实现。

转载于:https://www.cnblogs.com/yjmyzz/archive/2010/10/30/1865212.html

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

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

相关文章

为什么女生会有体香?

全世界只有3.14 % 的人关注了爆炸吧知识本文转载自微信公众号一只学霸&#xff08;ID&#xff1a;bajie203&#xff09;今天渣哥向我诉说了一个困扰了他很久的疑问看着渣哥这一副无知的样子学霸的内心暗爽就让你伟大而又聪慧的霸霸来为你揭开女生的真面目一说到这个学霸知道你们…

手游开发者交流会议暨OGEngine新版发布

2019独角兽企业重金招聘Python工程师标准>>> 手游开发者交流会议暨OGEngine新版发布 由OGEngine举办的第二次手游开发者交流会议以圆桌会议方式在深圳高新园举行。会议不仅吸引了手游开发者&#xff0c;也有海外支付商&#xff0c;国内外的手游发行商参加。 会议环绕…

python 绘制围棋棋盘_围棋之规则基础(一)

★本期导读&#xff1a;一、围棋的下法二、气★正文&#xff1a;一、围棋的下法1、 对局双方各执一色棋子。2、 空枰开局。3、 黑先白后&#xff0c;交替着一子于棋盘的交叉点上。4、 棋子下定后&#xff0c;不再向其它点移动。5、 轮流下子是双方的权利&#xff0c;但允许任何…

php pdo 查询语句,PDO:预处理语句(参数化查询)

(PDO(PHP data object/PHP数据对象))[PDO|预处理语句|参数化查询]The database library called PHP Data Objects or PDO for short can use drivers for many different database types, and supports a very important feature known as prepared statements, sometimes also…

WiFi密码都不会破译​还想考清华?​

1 18万的飞机票也能秒空&#xff1f;&#xff1f;&#xff1f;留学生&#xff1a;这是救命钱啊▼2 WiFi密码都不会破译还想考清华&#xff1f;▼3 好羡慕有这样的妈妈▼4 猫&#xff1a;你别进来&#xff0c;我这儿不接待小孩儿&#xff01;孩子&#xff1a;我就进去看看▼…

ASP.NET网页文本编辑器的使用

ASP.NET网页文本编辑器的使用&#xff0c;效果图如下&#xff1a; 这里要用到DotNetTextBox.dll组件&#xff0c;具体内容可以在http://sites.google.com/site/zhangqs008/chang-yong-gong-ju 下载&#xff0c;使用方法如下&#xff1a; 1.将“DotNetTextBox.dll”文件添加到工…

在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...

如果你要问我最近什么手游最火&#xff1f;那我的回答肯定就是《英雄联盟》手游了&#xff01;自从拳头公司在前几天爆出部分地区公测的消息之后&#xff0c;很多国内玩家就已经按耐不住自己激动的心了。由于国服没有公测&#xff0c;所以许多国内玩家便纷纷涌入日服和韩服。这…

php 电压 异常,tv断线警告是什么原因

电力系统中TV断线&#xff0c;就是电压互感器断线。TV断线一般可以分为TV 一次侧(高压)断线和二次侧(低压)断线&#xff0c;无论是哪一侧的断线&#xff0c;都将会使TV二次回路的电压异常&#xff0c;影响继电保护装置的正确动作。 (推荐学习&#xff1a;phpstorm)如果发生TV一…

《JavaScript 高级程序设计》 7.1 正则表达式支持

转载于:https://www.cnblogs.com/xiaochaohuashengmi/archive/2010/11/07/1871100.html

豆瓣9.7,这些舍不得看完的神剧,看一集少一集啊!

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——菌菌。菌菌&#xff0c;作为资深美剧迷英语博主&#xff0c;收藏了很多经典美剧、动画资源&#xff0c;每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过&#xff…

因子分析最少要有几个因子_Re0:魔女司教和魔女是什么关系?他们的魔女因子是魔女给的吗...

​魔女司教和魔女的能力一点关系都没有&#xff0c;而且魔女教一开始是正常的&#xff0c;直到艾米莉亚父母死后才出现各种大罪司教发疯&#xff0c;怠惰是艾米莉雅的养父&#xff0c;艾米莉亚一族守护的封印被虚饰魔女入侵&#xff0c;怠惰为了守护强行融合了魔女基因&#xf…

徒手打造基于Spark的数据工厂(Data Factory):从设计到实现

在大数据处理和人工智能时代&#xff0c;数据工厂&#xff08;Data Factory&#xff09;无疑是一个非常重要的大数据处理平台。市面上也有成熟的相关产品&#xff0c;比如Azure Data Factory&#xff0c;不仅功能强大&#xff0c;而且依托微软的云计算平台Azure&#xff0c;为大…

深度学习框架PyTorch与TensorFlow,谁更胜一筹?

全世界只有3.14 % 的人关注了爆炸吧知识自从2012年深度学习再一次声名鹊起以来&#xff0c;许多机器学习框架都争先恐后地要成为研究人员和行业从业者的新宠。面对如些众多的选择&#xff0c;人们很难判断最流行的框架到底是什么。在某些情况下&#xff0c;深度学习或深度迁移学…

Windows Server 2008 R2 之二十一远程桌面服务RD之二

一、远程桌面授权 远程桌面授权&#xff08;RD 授权&#xff09;以前称为终端服务授权&#xff08;TS 授权&#xff09;&#xff0c;它能够管理每个设备或用户与远程桌面会话主机&#xff08;RD 会话主机&#xff09;服务器连接所需的远程桌面服务客户端访问许可 (RDS CAL)。使…

件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发

微信小程序越来越受欢迎&#xff0c;很多小白也想制作自己的小程序。小白若想自己顺利制作&#xff0c;有两种方法&#xff1a;一种是下载安装微信官方开发者工具&#xff0c;然后写代码开发&#xff1b;一种是使用第三方小程序制作工具&#xff0c;选个现成的小程序模板&#…

Windows 11 预览版 Build 22000.168 发布

微软现已发布第八个 Windows 11 预览版更新 KB5005191&#xff0c;版本号升级至 Build 22000.168。本次更新面向 Beta 频道和 Dev 频道的 Windows 预览体验成员推出&#xff0c;Windows 11 Insider Preview Build 22000.168 主要变化如下。1.微软宣布 Microsoft Teams 现已支持…

都2020年了,翟天临对毕业生论文查重的影响还剩多少?

全世界只有3.14 % 的人关注了爆炸吧知识文内有福利2020年转眼就到了4月&#xff0c;对于20届的毕业生来说&#xff0c;这注定是一个不平凡的毕业季。然而&#xff0c;无论2020年经历了什么&#xff0c;在无数莘莘学子成为“社会人”之前&#xff0c;不得不面对一件事情&#xf…

apache 2.4 httpd.conf 详解_Linux Centos服务子系统详解

1、服务的分类启动与自启动&#xff1a;服务启动&#xff1a;就是在当前系统中让服务运行&#xff0c;并提供功能。服务自启动&#xff1a;自启动是指让服务在系统开机和重启之后&#xff0c;随着系统的启动而自动启动服务查询已安装的服务&#xff1a;RPM包安装的服务[rootloc…

Oracle 常用sql场景应用(未完待续......)

--1、创建一张学生信息表stuinfo&#xff0c;字段包括学号、姓名、性别、年龄、入学日期SQL>CREATE TABLE stuinfo (snochar(4),sname varchar2(10),sex int,age int,sdate date);Table created--2、创建stuinfo表主键约束SQL>ALTER TABLE stuinfo ADD CONSTRAINT pk_stu…

变态公式之如何算出圆的内部被切割成几块?

来来来赶紧拿纸笔出来一起算一个单位圆圆周上均匀分布 n 个点&#xff0c;互相连接&#xff0c;这个圆的内部会被分割为多少块&#xff1f;答案高能预警&#xff1a;来&#xff0c;我们来找规律&#xff0c;大家拿出纸和笔。前三个很简单&#xff0c;1,2,4&#xff0c;所以猜测…