C#实现顺序栈和链栈的代码实例
作者:Czhenya 发布时间:2021-08-17 02:36:40
标签:c#,栈
自己定义的栈的接口,完全是按照栈的常用方法以及命名方式实现:
注意以下类,接口都是在一个命名空间下
栈的接口:包括了常用的方法
namespace 栈
{
interface IStackDS<T>
{
int Count { get; }
int GetLength();
bool IsEmpty();
void Clear();
void Push(T item);
T Pop();
T Peek();
}
}
顺序栈的实现,参照顺序表实现
namespace 栈
{
class SeqStack<T> : IStackDS<T>
{
private T[] data; //栈
private int top; //栈顶
//构造函数
public SeqStack(int size) {
data = new T[size];
top = -1;
}
public SeqStack() : this(10)
{
data = new T[10];
top = -1;
}
//栈的元素个数属性
public int Count
{
get
{
return top + 1;
}
}
//清空栈的方法
public void Clear()
{
top = -1;
}
//获取栈的长度的方法
public int GetLength()
{
return Count;
}
//查看栈顶元素是什么
public T Peek()
{
if (top == -1)
{
Console.WriteLine("当前栈没有元素");
return default(T);
}
return data[top];
}
//出栈(取出栈顶元素,并移除)
public T Pop()
{
T temp = data[top];
top--;
return temp;
}
//入栈
public void Push(T item)
{
data[top + 1] = item;
top++;
}
//栈中是否源元素
public bool IsEmpty()
{
return Count==0;
}
}
}
以上是顺序栈的实现
下面是链栈的实现,定义一个节点类
namespace 栈
{
/// <summary>
/// 链栈的节点
/// </summary>
/// <typeparam name="T"></typeparam>
class Node<T>
{
private T data; //数据
private Node<T> next; //指向下一个的引用
//四个构造函数,不是都有用,,以及上面两个变量的属性,
public Node()
{
data = default(T);
next = null;
}
public Node(T data)
{
this.data = data;
next = null;
}
public Node(T data , Node<T> index)
{
this.data = data;
this.next = index;
}
public Node(Node<T> index)
{
data = default(T);
next = index;
}
public T Data
{
get { return data; }
set { data = value; }
}
public Node<T> Next
{
get { return next; }
set { next = value; }
}
}
}
链栈的实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 栈
{
class LinkStark<T> : IStackDS<T>
{
private Node<T> top; //栈顶元素节点
private int count = 0; //栈里面的元素
public int Count
{
get
{
return count;
}
}
/// <summary>
/// 清空栈中数据
/// </summary>
public void Clear()
{
count = 0;
top = null;
}
/// <summary>
/// 栈的长度
/// </summary>
/// <returns></returns>
public int GetLength()
{
return Count;
}
/// <summary>
/// 栈中是否有数据
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
return count == 0;
}
public T Peek()
{
return top.Data;
}
/// <summary>
/// 出栈 取得栈顶元素然后删除
/// </summary>
/// <returns></returns>
public T Pop()
{
T data = top.Data;
top = top.Next;
count--;
return data;
}
/// <summary>
/// 入栈
/// </summary>
/// <param name="item"></param>
public void Push(T item)
{//把新添加的元素作为头结点,就是栈顶
Node<T> newNode = new Node<T>(item);
newNode.Next = top;
top = newNode;
count++;
}
}
}
以上是链栈的实现
下面是测试:
C#库中带的栈
自己的写的顺序栈
自己写的链栈
amespace 栈
{
class Program
{
static void Main(string[] args)
{
//使用BCL中的栈
//Stack<char> stack = new Stack<char>();
//使用自己的栈
// SeqStack<char> stack = new SeqStack<char>();
//使用自己的链栈
IStackDS<char> stack = new LinkStark<char>();
stack.Push('a');
stack.Push('b');
stack.Push('c');
Console.WriteLine("push后的数据个数"+ stack.Count);
char temp = stack.Pop();
Console.WriteLine("pop 之后数据是:"+ temp);
Console.WriteLine("pop 之后数据个数"+stack.Count);
char temp2 = stack.Peek();
Console.WriteLine("Peek 之后数据是:" + temp2);
Console.WriteLine("Peek 之后数据个数" + stack.Count);
Console.ReadKey();
}
}
}
下篇队列的实现同理:https://www.jb51.net/article/149555.htm
来源:https://blog.csdn.net/czhenya/article/details/78077821


猜你喜欢
- 在上篇文章给大家介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结,如果大家有需要可以参考下。$和#简单说明:#相当于对数据
- 一、项目简述功能包括(管理员和学生角色): 管理员和学生登录,图书管理,图书添加删除修改,图书 借阅,图书归还,图书查看,学生管理,借还管理
- 定义建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不
- Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RF
- 前言在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis、hibernate、JPA)就无法满足
- 一:父级pom.xml文件 resources目录下新建指定文件夹,存放Spring配置文件<profiles> &
- 前言本文主要给大家介绍了关于Spring4自定义@Value功能的相关内容,使用的Spring版本4.3.10.RELEASE,下面话不多说
- 本文实例讲述了C#把数组中的某个元素取出来放到第一个位置的实现方法。分享给大家供大家参考。具体分析如下:如何取出数组中符合某种条件的元素,然
- 第一个为大家分享的是C#字符串使用密钥进行加解密代码,具体内容如下public class DesEncrypt {  
- 1. Text日常最常用的应该就是显示文字,所以有必要说一下Text控件。首先源码如下:@Composablefun Text(  
- Java多态成员访问的特点多态概要多态是面向对象编程的三个特性之一,这里不展开做过多介绍,有机会专门写一个关于继承,封装,多态三大特性的文章
- 水印种类及功能介绍 PDF水印分为两种:文本水印和图片水印。文本水印一般被用在商业领域,提醒读者该文档是受版权保护的,其他人不能抄
- 返回值转成JSONString的处理主要需求描述有些返回值中的null需要转换成“”或[],另外有些
- 本文实例讲述了java实现新浪微博Oauth接口发送图片和文字的方法。分享给大家供大家参考。具体如下:基于网上很多人利用新浪api开发新浪微
- 下面的示例提供对某个已存档类型的基本概述。示例// If compiling from the command line, compile
- SpringMVC配置多个properties文件之通配符在springmvc中配置加载properties文件一般会在xml文件中配置如下
- jedis是redis的java客户端,spring将redis连接池作为一个bean配置。redis连接池分为两种,一种是“redis.c
- 本文实例为大家分享了Java实现高校教务系统的具体代码,供大家参考,具体内容如下需求:建立一个教务管理系统,为学生和教师提供不同的功能//简
- 导出Excel在很多项目中经常用到,本人介绍了C#实现GridView导出Excel实例代码,也全当给自己留下个学习笔记了。using Sy
- 不得不说opencv是个强大的东东,以前做一个项目的一个模块时使用到进行图形处理,这次是想将一个视频的播放放慢,以前在网上看到opencv有