数据结构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;今天渣哥向我诉说了一个困扰了他很久的疑问看着渣哥这一副无知的样子学霸的内心暗爽就让你伟大而又聪慧的霸霸来为你揭开女生的真面目一说到这个学霸知道你们…

心路

从昨天在电脑上COPY上《头文字D》后&#xff0c;到现在我看了三遍了&#xff0c;但是我还是在看&#xff0c;我不知道自己是为了什么&#xff0c;难道是我想找一个好的结果吗&#xff0c;没有的呀&#xff0c;不管怎么样&#xff0c;导演安排的就是这个样子&#xff0c;可是我还…

手游开发者交流会议暨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…

Asp.Net Core安全防护-客户端IP白名单限制

前言本篇展示了如何在ASP.NET Core应用程序中设置IP白名单验证的2种方式。你可以使用以下2种方式&#xff1a;用于检查每个请求的远程 IP 地址的中间件。MVC 操作筛选器&#xff0c;用于检查针对特定控制器或操作方法的请求的远程 IP 地址。中间件Startup.Configure方法将自定义…

Win2003中apache2整合tomcat5和iis6

为了能在已经存在iis6的服务器上运行自己的java程序&#xff0c;经过历时半年的尝试&#xff0c;今天终于搞定了&#xff0c;好开心啊。最开始是用iis直接连接tomcat&#xff0c;找遍了网上所有的资料&#xff0c;可是死活也连不通&#xff0c;或许是iis的封闭吧&#xff0c;看…

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;所以许多国内玩家便纷纷涌入日服和韩服。这…

如何用 Linq 进行多重 Orderby ?

咨询区 Sasha&#xff1a;我有两张表&#xff1a;movies 和 categories&#xff0c;我想获取一个先按 categoryid 再按 Name 排序的list。movie 表有三个列&#xff1a;ID,Name,CategoryID。category 表有两个列&#xff1a;ID,Name。我设想的伪代码如下&#xff1a;var movies…

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…

一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第三十集

林晓黎在暗中观察股市行情&#xff0c;设计告发云氏集团暗中控股。证券会派人调查云氏集团&#xff0c;慕容家的股票甚至直接停盘。而完成了这次报复的林晓黎心中却并没有复仇的快感&#xff0c;他觉得空虚、歉疚&#xff0c;没有脸再去见云朵。 在全家精神濒临崩溃的关口&…

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

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

非类型模板参数

对于函数模板与类模板&#xff0c;模板参数并不局限于类型&#xff0c;普通值也可以作为模板参数。在基于类型参数的模板中&#xff0c;你定义了一些具体的细节来加以确定代码&#xff0c;直到代码被调用时这些细节才被真正的确定。但是在这里&#xff0c;我们面对的是这些细节…

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

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

PHP如何防采集方法代码

1 <?php 2 /**3 * FileName:test.php4 * Summary: 防采集5 * Author: sinob6 * CreateTime: 2005-10-18 7 * LastModifed:2005-10-18 8 * 请参见http://mall.yi85.com/9 */10 $HTTP_REFERER$_SERVER["HTTP_REFERER"];11 $HTTP_USER_AGENT$_SERVER["HTTP_USE…