1. 程式人生 > >數據結構-棧&鏈棧

數據結構-棧&鏈棧

先進後出 入棧 system tel read alt image summary esp

技術分享圖片

技術分享圖片

棧接口實現:

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

namespace _002_棧
{
    /// <summary>
    /// 棧接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    interface IStackDS<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_棧
{
    /// <summary>
/// 順序棧 /// </summary> /// <typeparam name="T"></typeparam> 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; } } /// <summary> /// 清空 /// </summary> public void Clear() { top = -1; } /// <summary> /// 獲得長度 /// </summary> /// <returns></returns> public int GetLength() { return Count; } /// <summary> /// 是否為空 /// </summary> /// <returns></returns> public bool isEmpty() { return Count == 0; } /// <summary> /// 取得棧頂數據,但不刪除 /// </summary> /// <returns></returns> public T Peek() { if (isEmpty()) { Console.WriteLine("棧為空,無法彈棧"); return default(T); } return data[top]; } /// <summary> /// 出棧,並且刪除數據 /// </summary> /// <returns></returns> public T Pop() { if (isEmpty()) { Console.WriteLine("棧為空,無法彈棧"); return default(T); } else { T temp = data[top]; top--; return temp; } } /// <summary> /// 入棧 /// </summary> /// <param name="item"></param> public void Push(T item) { if (IsFull()) { Console.WriteLine("棧已滿,無法入棧"); } else { data[top + 1] = item; top++; } } public bool IsFull() { if (top == data.Length) { return true; } return false; } } }

鏈棧

技術分享圖片

技術分享圖片

鏈節點:

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

鏈棧實現:

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


        public LinkStack()
        {
            top = null;
            count = 0;
        }

        /// <summary>
        /// 取得棧中元素的個數
        /// </summary>
        public int Count {  
         get {
                return count;
             }
        }
        /// <summary>
        /// 清空棧中所有數據
        /// </summary>
        public void Clear()
        {
            count = 0;
            top = null;
        }

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

        /// <summary>
        /// 是否為空棧
        /// </summary>
        /// <returns></returns>
        public bool isEmpty()
        {
            return count == 0;
        }

        /// <summary>
        /// 取得棧頂元素
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            if (isEmpty())
            {
                return default(T);
            }
            return top.Data;
        }
        /// <summary>
        /// 出棧 取得棧頂元素,然後刪除
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            if (isEmpty())
            {
                return default(T);
            }
            else
            {
                //先進後出原則,直接把top弄出去
                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);
            if (top == null)
            {
                top = newNode;
            }
            else
            {
                newNode.Next = top; 
                top = newNode;
            }
            count++;
        }
    }
}

棧應用

/// <summary>
        /// 十進制轉八進制
        /// </summary>
        /// <param name="n"></param>
        public static void TenConversionEight(int n)
        {
            LinkStack<int> stack = new LinkStack<int>();
            while (n>0)
            {
                stack.Push(n % 8);
                 n = n/8;
            }
            while (!stack.isEmpty())
            {
                Console.Write("{0}", stack.Pop());
            }
            Console.WriteLine("");
        }

數據結構-棧&鏈棧