欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现顺序栈和链栈的代码实例

程序员文章站 2023-12-05 21:26:46
自己定义的栈的接口,完全是按照栈的常用方法以及命名方式实现: 注意以下类,接口都是在一个命名空间下 栈的接口:包括了常用的方法 namespace 栈...

自己定义的栈的接口,完全是按照栈的常用方法以及命名方式实现:

注意以下类,接口都是在一个命名空间下

栈的接口:包括了常用的方法

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++;
  }
 }
}

以上是链栈的实现

下面是测试:

  1. c#库中带的栈
  2. 自己的写的顺序栈
  3. 自己写的链栈
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();
  }
 }
}

下篇队列的实现同理:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接