数据结构系列:链栈[C#][第二部分]

本文介绍了如何在C#中实现链栈,首先定义接口,然后通过创建Node类表示链栈节点,每个节点包含数据和指向前一个节点的引用。接着实现接口中的方法,创建栈顶节点,并使用计数器辅助遍历。通过这种方式,成功构建了链栈数据结构。作者表示,通过理解链栈,已经为实现链表和顺序表奠定了基础,并表达了进入游戏公司的决心。
摘要由CSDN通过智能技术生成

首先,提供一个接口,里面写好方法,甚至跟上次的顺序栈可以是一样的,不过我换了个解决方案,于是就重新制作了一个。

namespace 链栈
{
    interface StackDS<T>
    {//不写那么多了
        int Count { get; }  //获得数据的数量,属性?//迷惑
        int Size { get; }

        int GetLength();//获得长度
        bool isEmpty();//是否为空
        void Clear();//清空
        void Push(T item);//入站

        T Pop();//返回值是我们要准备出栈的元素
        T Peek();//获得栈顶的元素
        T[] Travel();   
    }
}

做完之后,就是链栈与顺序栈最大的差别,
总所周知,我们顺序栈是按照数组来存储的,本身就有index序号
但是我们现在的链栈,是通过每一个结点连着其前面的结点,
而后面新的结点又连着他,如此循环而生成,

最后一个结点则是我们的头结点(因为方便取出,我们该放在头)

下面是Node 结点类的生成

//概念是, 创造一个新的类型
//他具有
1.存储数据的能力
2.指向前面的那个结点(里面也有元素跟同样的指向)

   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> next)
        {
            this.data = data;
            this.next = next;
        }
        public Node(Node<T> next)
        {
            this.next = next;
        }
        
       public  T Data { get { return data; } set { data = value; } }
       public Node<T> Next
        {
            get { return next; }
            set { next = value; }
        }

    }
}

紧接着,利用这一个类,跟一个接口,我们直接生成我们的class 链表

//1.首先实现 接口中的方法
//2.将结点制作出来, 称为栈顶结点 (top)
//3.制作count,方便遍历,你懂的

namespace 链栈
{
    class LinkStack<T> : StackDS<T>
    {//持有一个头结点

        private Node<T> top;//栈顶元素的结点  //寻找头
        private int count = 0;//栈中元素的个数//用来遍历

        public int Count
        {
            get
            {
                return count;
            }
        }
        
        public void Clear()
        {
            count = 0;
            top = null;
        }

        //返回元素的个数,不可改变
        public int GetLength()
        {
            return count;
        }

        public bool isEmpty()
        {
          return  count == 0;
        }

        public T Peek()
        {
            return top.Data;//只取得数据
        }

        public T Pop()//同push
        {
            T data = top.Data;//需要返回的栈顶的数据
            top = top.Next;//原来的栈顶变回了栈顶
            count--;
            return data;
        }

        public void Push(T item)//这段是最困难的
        {
            //创建第一个 结点, 然后作为新的头结点
            //第二步,指向原来的结点
            //第三步,top现在有了新的结点。
            Node<T> newNode = new Node<T>(item);//创造一个新结点
            newNode.Next = top;//之前的头为现在的下一个
            top = newNode;     //现在为目前的头结点
            count++;

        }

        public T[] Travel()
        {//我其实有想尝试自己在里面遍历,但是意义不是很大可能
            throw new NotImplementedException();
        }
    }
}

最后,我们的链栈就实现了,然后在主程序中运行一下。

 class Program
    {
        static void Main(string[] args)
        {

            LinkStack<int> linkStack = new LinkStack<int>();
            linkStack.Push(1);
            linkStack.Push(2);
            linkStack.Push(3);

            int a = linkStack.Pop();
            linkStack.Pop();//这里又少了一个元素。
            Console.WriteLine(a);
            Console.WriteLine(linkStack.Count);

            linkStack.Clear();
            bool b = linkStack.isEmpty();
            Console.WriteLine(b);
            Console.WriteLine(linkStack.Count);
            Console.ReadKey();

        }
    }

在这里插入图片描述

那么栈就到一段落了,说实话,从这个链栈中,
我已经大概能自己实现链表跟顺序表了,期待自己的努力,
一定要加油,一定要进游戏公司。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值