C#实现数据结构-线性表(二)

本文章纯属个人练习笔记,如有错误欢迎纠正。

顺序栈和链栈实现

1、通用接口实现如下:

namespace 手撕数据结构之线性表.顺序栈及链栈
{
    /// <summary>
    /// 通用接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    interface IStack<T>
    {
        void Push(T item);
        T Pop();
        T Peek();
        int GetLength();
        void Clear();
        bool isEmpty();
    }
}

2、顺序栈实现类如下:

namespace 手撕数据结构之线性表.顺序栈
{
    /// <summary>
    /// 顺序栈
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class SeqStack<T> : IStack<T>
    {
        private T[] datas; //数据存储
        private int top; //栈顶索引

        public SeqStack(int size) //构造函数初始化栈大小
        {
            datas = new T[size];
            top = -1;
        }

        public SeqStack() : this(100) //默认大小为100
        {

        }

        /// <summary>
        /// 栈元素个数
        /// </summary>
        public int Length
        {
            get { return top + 1; }
        }

        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="item"></param>
        public void Push(T item)
        {
            datas[top + 1] = item;
            top++;
        }

        /// <summary>
        /// 出栈(删除栈顶元素)
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            if (isEmpty())
            {
                Console.WriteLine("栈为空!");
                return default(T);
            }
            T temp = datas[top];
            top--;
            return temp;
        }

        /// <summary>
        /// 出栈(不删除栈顶元素)
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            if (isEmpty())
            {
                Console.WriteLine("栈为空!");
                return default(T);
            }
            return datas[top];
        }

        /// <summary>
        /// 获取栈元素个数
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return Length;
        }

        /// <summary>
        /// 清空栈
        /// </summary>
        public void Clear()
        {
            top = -1;
        }

        /// <summary>
        /// 判断栈是否为空
        /// </summary>
        /// <returns></returns>
        public bool isEmpty()
        {
            return Length == 0;
        }
    }
}

测试代码:

namespace 手撕数据结构之线性表.顺序栈及链栈
{
    class Program
    {
        static void Main(string[] args)
        {
            SeqStack<string> stack = new SeqStack<string>();

            stack.Push("abc");
            stack.Push("asdas");
            stack.Push("1dasd");

            Console.WriteLine("栈中数据个数为:" + stack.GetLength());
            Console.WriteLine("栈顶元素为:" + stack.Pop());
            Console.WriteLine("栈顶元素为:" + stack.Peek());
            stack.Clear();
            Console.WriteLine("栈中数据个数为:" + stack.GetLength());
        }
    }
}

 

3、链栈实现如下:

链栈节点类:

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(Node<T> next)
        {
            data = default(T);
            this.next = next;
        }

        public Node(T data, Node<T> next)
        {
            this.data = data;
            this.next = next;
        }

        public T Data
        {
            get { return data; }
            set { data = value; }
        }

        public Node<T> Next
        {
            get { return next;}
            set { next = value; }
        }
    }
}

链栈实现类:

namespace 手撕数据结构之线性表.链栈
{
    /// <summary>
    /// 链栈
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class LinkStack<T> : IStack<T>
    {
        private Node<T> top; //栈顶节点(头节点)
        private int length; //栈长

        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="item"></param>
        public void Push(T item)
        {
            Node<T> newNode = new Node<T>(item);
            newNode.Next = top;
            top = newNode;
            length++;
        }

        /// <summary>
        /// 出栈(删除栈顶元素)
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            if (isEmpty())
            {
                Console.WriteLine("栈为空!");
                return default(T);
            }
            T data = top.Data;
            top = top.Next;
            length--;
            return data;
        }

        /// <summary>
        /// 出栈(不删除栈顶元素)
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            if (isEmpty())
            {
                Console.WriteLine("栈为空!");
                return default(T);
            }
            return top.Data;
        }

        public int GetLength()
        {
            return length;
        }

        public void Clear()
        {
            top = null;
            length = 0;
        }

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

测试代码:

namespace 手撕数据结构之线性表.顺序栈及链栈
{
    class Program
    {
        static void Main(string[] args)
        {
            LinkStack<string> stack = new LinkStack<string>();

            stack.Push("abc");
            stack.Push("asdas");
            stack.Push("1dasd");

            Console.WriteLine("栈中数据个数为:" + stack.GetLength());
            Console.WriteLine("栈顶元素为:" + stack.Pop());
            Console.WriteLine("栈顶元素为:" + stack.Peek());
            stack.Clear();
            Console.WriteLine("栈中数据个数为:" + stack.GetLength());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值