浅析数据结构系列(三)

5 篇文章 0 订阅
1 篇文章 0 订阅

话不多说,继续介绍我们的数据结构常用的—栈

栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶( Top),另一端是固定的,叫栈底( Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。
栈通常记为: S= (a1,a2,…,an),S是英文单词stack的第 1 个字母。a1为栈底元素,an为栈顶元素。这n个数据元素按照a1,a2,…,an的顺序依次入栈,而出栈的次序相反,an第一个出栈,a1最后一个出栈。所以,栈的操作是按照后进先出(Last In First Out,简称LIFO)或先进后出(First In Last Out,简称FILO)的原则进行的,因此,栈又称为LIFO表或FILO表。

  • 顺序栈的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Stack
{
    public interface IStackD<T>
    {
        /// <summary>
        /// 取得栈数据元素的个数
        /// </summary>
        int Count { get; }

        /// <summary>
        /// 栈元素的长度
        /// </summary>
        /// <returns></returns>
        int GetLength();

        /// <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();
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Stack
{
    /// <summary>
    /// 顺序栈实现的方式
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class SeqStack<T> : IStack<T>
    {

        private T[] data;//存储数据
        private int top = -1;//用来指向栈顶索引的指针


        public SeqStack() : this(10)
        {

        }

        public SeqStack(int size)
        {
            data = new T[size];
            top = -1;
        }


        public int Count
        {

            get { return top + 1; }
        }

        public void Clear()
        {
            top = -1;
        }

        public int GetLength()
        {
            return Count;
        }

        public bool IsEmpty()
        {
            return Count == 0;
        }

        public T Peek()
        {
            return data[top];
        }

        public T Pop()
        {
            T temp = data[top];
            top--;

            return temp;
        }

        public void Push(T item)
        {
            data[top + 1] = item;
            top++;
        }
    }
}

  • 链栈的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Stack
{
    /// <summary>
    /// 链栈的结点
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public 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)
        {
            data = default(T);
            this.next = next;
        }

        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 Stack
{
    /// <summary>
    /// 链栈的实现
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class LinkStack<T> : IStack<T>
    {
        /// <summary>
        /// 栈顶元素结点
        /// </summary>
        private Node<T> top = null;

        /// <summary>
        /// 栈中的元素的个数
        /// </summary>
        private int count = 0;

        public int Count
        {
            get { return count; }
        }

        public void Clear()
        {
            top = null;
            count = 0;

        }

        public int GetLength()
        {
            return count;
        }

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

        public T Peek()
        {
            return top.Data;
        }


        public T Pop()
        {
            T data = top.Data;
            top = top.Next;
            count--;
            return data;
        }

        public void Push(T item)
        {
            //把新添加的元素作为栈顶的元素(头结点)
            Node<T> newNode = new Node<T>(item);
            newNode.Next = top;
            top = newNode;
            count++;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值