C#數(shù)據(jù)結(jié)構(gòu)與算法之棧淺析
C#數(shù)據(jù)結(jié)構(gòu)與算法之棧(stack)在計算機科學(xué)中是限定僅在表尾進行插入或刪除操作的線形表。它按照后進先出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時候從棧頂開始彈出數(shù)據(jù)(最后一個數(shù)據(jù)被第一個讀出來,它只能在某一端插入和刪除的特殊線性表。用桶堆積物品,先堆進來的壓在底下,隨后一件一件往堆。取走時,只能從上面一件一件取。堆和取都在頂部進行,底部一般是不動的。
C#數(shù)據(jù)結(jié)構(gòu)與算法之棧就是一種類似桶堆積物品的數(shù)據(jù)結(jié)構(gòu),進行刪除和插入的一端稱棧頂,另一堆稱棧底。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。 棧也稱為后進先出表(LIFO表)。
C#數(shù)據(jù)結(jié)構(gòu)與算法之棧1、進棧(PUSH)算法
◆若TOP≥n時,則給出溢出信息,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢出;不滿則作②);
◆置TOP=TOP+1(棧指針加1,指向進棧地址);
◆S(TOP)=X,結(jié)束(X為新進棧的元素);
C#數(shù)據(jù)結(jié)構(gòu)與算法之棧2、退棧(POP)算法
◆若TOP≤0,則給出下溢信息,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作②);
◆X=S(SOP),(退棧后的元素賦給X);
◆TOP=TOP-1,結(jié)束(棧指針減1,指向棧頂)。
C#數(shù)據(jù)結(jié)構(gòu)與算法之棧的實現(xiàn)接口:
- public interface IStack<T>
- {
- int Length();
- bool IsEmpty();
- void Clear();
- void Push(T items);
- T Pop();
- T GetPopValue();
- }
下面的代碼是C#數(shù)據(jù)結(jié)構(gòu)與算法之棧的實現(xiàn)的類:
- 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("棧已經(jīng)為空", "Item Null");
- }
- return item[top];
- }
- }
下面是C#數(shù)據(jù)結(jié)構(gòu)與算法之棧進行測試:
- 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("------棧已經(jīng)插入數(shù)據(jù)----");
- Console.WriteLine(js.Length());
- Console.WriteLine(js.IsEmpty().ToString());
- Console.WriteLine("------取棧頂數(shù)據(jù)----");
- 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();
- }
當你需要把對象的順序反過來的時候,你就可以按順序把對象放棧里,然里再從棧里取出來,這時功能就實現(xiàn)了。
C#數(shù)據(jù)結(jié)構(gòu)與算法之棧的相關(guān)內(nèi)容就向你介紹到這里,希望對你學(xué)習(xí)C#數(shù)據(jù)結(jié)構(gòu)與算法中的棧有所幫助。
【編輯推薦】