C# 資料結構與演算法系列(四) 棧

來源:互聯網
上載者:User
棧(stack)在電腦科學中是限定僅在表尾進行插入或刪除操作的線形表。它按照後進先出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後一個資料被第一個讀出來,它只能在某一端插入和刪除的特殊線性表。用桶堆積物品,先堆進來的壓在底下,隨後一件一件往堆。取走時,只能從上面一件一件取。堆和取都在頂部進行,底部一般是不動的。

棧就是一種類似桶堆積物品的資料結構,進行刪除和插入的一端稱棧頂,另一堆稱棧底。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。 棧也稱為後進先出表(LIFO表)。

1、進棧(PUSH)演算法
1、若TOP≥n時,則給出溢出資訊,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢出;不滿則作②);
2、置TOP=TOP+1(棧指標加1,指向進棧地址);
3、S(TOP)=X,結束(X為新進棧的元素);

2、退棧(POP)演算法
1、若TOP≤0,則給出下溢資訊,作出錯處理(退棧前先檢查是否已為空白棧, 空則下溢;不空則作②);
2、X=S(SOP),(退棧後的元素賦給X);
3、TOP=TOP-1,結束(棧指標減1,指向棧頂)。

下面看一下棧的實現介面:   public interface IStack<T>
   {
       int Length();
       bool IsEmpty();
       void Clear();
       void Push(T items);
       T Pop();
       T GetPopValue();
   }

下面的代碼是棧的實現的類:Code

   public class JStack<T> : IStack<T>
   {
       private int size;
       private T[] item;
       private int top; 

       public T this[int index]
       {
           get { return item[index]; }
           set { item[index] = value; }
       } 

       public int Size
       {
           get { return size; }
           set { size = value; }
       } 

       public int Top
       {
           get { return top; }
       }

 

       public JStack(int length)
       {
           top = -1;
           size = length;
           item = new T[length];
       } 

       public int Length()
       {
           return top + 1;
       }       

       public bool IsEmpty()
       {
           return (top == -1);
       } 

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

       public void Push(T items)
       {
           if (top < size - 1)
           {
               item[++top] = items;
           }
       } 

       public T Pop()
       {
           T tmp = default(T);
           if (!IsEmpty())
           {
               tmp = item[top];
           }
           return tmp;
       } 

       public T GetPopValue() 
       {
           if (IsEmpty())
           {
               throw new ArgumentNullException("棧已經為空白", "Item Null");
           }
           return item[top];
       }
    }

下面進行測試:

      

Code
           try
           {
               JStack<string> js = new JStack<string>(20);
               Console.WriteLine("------棧剛初始化完成----");
               Console.WriteLine(js.Length());
               Console.WriteLine(js.IsEmpty().ToString());
               js.Push("A");
               js.Push("B");
               js.Push("C");
               js.Push("D");
               Console.WriteLine("------棧已經插入資料----");
               Console.WriteLine(js.Length());
               Console.WriteLine(js.IsEmpty().ToString());

               Console.WriteLine("------取棧頂資料----");
               Console.WriteLine(js.GetPopValue().ToString());

               Console.WriteLine("------清棧----");
               js.Clear();
               Console.WriteLine(js.GetPopValue().ToString());
               Console.ReadLine();
           }
           catch (Exception ex)
           {
               Console.WriteLine(ex.Message);
               Console.ReadLine();
           } 

當你需要把對象的順序反過來的時候,你就可以按順序把對象放棧裡,然裡再從棧裡取出來,這時功能就實現了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.