1. 程式人生 > >C# 資料結構 棧

C# 資料結構 棧

資料結構學習之路-第三章:棧的應用

https://blog.csdn.net/libin1105/article/details/48295439

C# 棧的應用

https://blog.csdn.net/qq_42606051/article/details/81080385

 

在一個棧的輸入序列為12345 下面哪個不可能是棧的輸出序列?

A. 23415  B.54132  C.23145  D.15432

 


23415------>1進棧,2進棧,2出棧,3進棧,3出棧,4進棧,4出棧,1出棧,5進棧,5出棧
23145------>1進棧,2進棧,2出棧,3進棧,3出棧,1出棧,4進棧,4出棧,5進棧,5出棧
15432------>1進棧,1出棧,2進棧,2進棧,4進棧,5進棧,5出棧,4出棧,3出棧,2出棧

54132不可能。

何為棧

棧(stack):是限定僅在表尾進行插入和刪除操作的線性表

棧(Stack)是操作限定在表的尾端進行的線性表。表尾由於要進行插入、刪除等操作,所以,它具有特殊的含義,把表尾稱為棧頂( Top),另一端是固定的,叫棧底( Bottom)。當棧中沒有資料元素時叫空棧(Empty Stack)。 棧的操作示意圖如圖所示。

 操作

public interface IStack<T> {
    int Count{get;}
    int GetLength(); //求棧的長度
    bool IsEmpty(); //判斷棧是否為空
    void Clear(); //清空操作
    void Push(T item); //入棧操作
    T Pop(); //出棧操作   返回要刪除的資料 並刪除資料
    T Peek(); //取棧頂元素 不刪除
}

順序棧

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

namespace _002_棧
 {
    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)
        {
        } 


        public int Count
        {
            get { return top + 1; }
        }

        public int GetLength()
        {
            return Count;
        }

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

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

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

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

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

鏈棧

結點

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

namespace _002_棧 {
    /// <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> next)
        {
            this.data = data;
            this.next = next;
        }

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

        //屬性
        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 _002_棧 {
    class LinkStack<T>:IStackDS<T>
    {
        private Node<T> top;// 棧頂元素結點
        private int count = 0;//棧中元素的個數

        /// <summary>
        ///  取得棧中元素的個數
        /// </summary>
        public int Count
        {
            get { return count; } 
        }

        /// <summary>
        /// 取得棧中元素的個數
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return count;
        }

        /// <summary>
        /// 判斷棧中是否有資料
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return count == 0;
        }

        /// <summary>
        /// 清空棧中所有的資料
        /// </summary>
        public void Clear()
        {
            count = 0;
            top = null;
        }

        /// <summary>
        /// 入棧
        /// </summary>
        /// <param name="item"></param>
        public void Push(T item)
        {
            //把新新增的元素作為頭結點(棧頂)
            Node<T> newNode = new Node<T>(item);
            newNode.Next = top;
            top = newNode;
            count++;
        }

        /// <summary>
        /// 出棧  取得棧頂元素,然後刪除
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            T data = top.Data;
            top = top.Next;
            count--;
            return data;
        }

        /// <summary>
        /// 取得棧頂中的資料,不刪除棧頂
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            return top.Data;
        }
    }
}

應用

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

namespace _002_棧 {
    class Program {
        static void Main(string[] args) {
            //1,使用BCL中的Stack<T>
            //Stack<char> stack = new Stack<char>();
            //2,使用我們自己的順序棧
            //IStackDS<char> stack = new SeqStack<char>(30);
            //3,使用我們自己的鏈棧
            IStackDS<char> stack = new LinkStack<char>();

            stack.Push('a');
            stack.Push('b');
            stack.Push('c');//棧頂資料
            Console.WriteLine("push a b c之後的資料個數為:"+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);

            stack.Clear();

            Console.WriteLine("clear 之後棧中資料的個數:" + stack.Count);
            //Console.WriteLine("空棧的時候,取得棧頂的值:"+stack.Peek());// 出現異常
            //當空棧的時候,不要進行peek或者pop操作 ,否則會出現異常

            Console.ReadKey();
        }
    }
}