C#數據結構之棧與隊列

隊列的插入操作在表的一端進行而其他操作在表的另一端進行棧的操作只能在表的一端進行棧和隊列成為操作受限的線性表棧(Stack)是操作限定在表的尾端進行的線性表。

表尾稱為棧頂(Top),另一端稱為棧底(Bottom),當棧中沒有數據元素時叫空棧(Empty Stack)

重要方法

1.Push()入棧 //添加數據

2.Pop()出棧 //刪除數據,返回被刪除的數據

3.Peek()//取得棧頂的元素,不刪除

4.Clear()//清空所有數據

5.Count //取得棧中元素的個數

棧的接口定義

public interface IStack{

int Count{get;}//求棧中元素個數

int GetLength();//求棧的長度

bool IsEmpty();//判斷棧是否為空

void Clear();//清空操作

void Push(T item);//入棧操作

T Pop();//出棧操作

T Peek();//取棧頂元素

}

用一片連續的存儲空間來存儲棧中的數據元素(使用數組),這樣的棧稱為順序棧(Sequence Stack)。類似于順序表,用一維數組來存放順序棧中的數據元素。棧頂指示器 top 設在數組下標為 0 的端, top隨著插入和刪除而變化,當棧為空時,top=-1。

順序棧的實現

class SeqStack:IStack

???{

? ? ? private T[] data;

???????private int top;

???????public SeqStack(int size)

???????{

??????????? data = new T[size];

??????????? top = -1;

???????}

???????//默認構造數組的最大容量為10

???????public SeqStack():this(10)

???????{

???????}

???????public int GetLength()

???????{

??????????? return top + 1;

???????}

???????public int Count

???????{

??????????? get

??????????? {

??????????????? return GetLength();

??????????? }

???????}

???????public bool IsEmpty()

???????{

??????????? return top <= -1;

???????}

???????public void Clear()

???????{

??????????? top = -1;

??????????? Array.Clear(data,0,data.Length);

???????}

???????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];

???????}

??? }

棧的另外一種存儲方式是鏈式存儲,這樣的棧稱為鏈棧(Linked Stack)。由于鏈棧的操作只是在一端進行,為了操作方便,把棧頂設在鏈表的頭部,并且不需要頭結點。

鏈棧的實現

public class Node

{

???private T data; //數據域

???private Node next; //引用域

//構造器

???public Node(T val, Node p)

???{

???????data = val;

???????next = p;

???}

//構造器

???public Node(Node p)

???{

???????next = p;

???}

//構造器

???public Node(T val)

???{

???????data = val;

???????next = null;

???}

//構造器

???public Node()

???{

???????data = default(T);

???????next = null;

???}

//數據域屬性

???public T Data

???{

???????get { return data; }

???????set { data = value; }

???}

//引用域屬性

???public Node Next

???{

???????get { return next; }

???????set { next = value; }

???}

}

隊列(Queue)是插入操作限定在表的尾部而其它操作限定在表的頭部進行的線性表。把進行插入操作的表尾稱為隊尾(Rear),把進行其它操作的頭部稱為隊頭(Front)。當隊列中沒有數據元素時稱為空隊列(EmptyQueue)。

方法

1.Enqueue() 入隊(放在隊尾)

2.Dequeue() 出隊(移除隊首元素,并返回被移除的元素)

3.Peek() 取得隊首的元素,不移除

4.Clear() 清空元素

隊列接口定義

public interface IQueue<T>{

int Count{get;}//取得隊列長度的屬性

int GetLength();//求隊列的長度

bool IsEmpty();//判斷隊列是否為空

void Clear();//清空隊列

void Enqueue(T item);//入隊

T Dequque();//出隊

T Peek();//取隊頭元素

}

用一片連續的存儲空間來存儲隊列中的數據元素,這樣的隊列稱為順序隊列(SequenceQueue)。類似于順序棧,用一維數組來存放順序隊列中的數據元素。隊頭位置設在數組下標為 0 的端,用 front 表示;隊尾位置設在數組的另一端,用rear 表示。 front 和 rear 隨著插入和刪除而變化。當隊列為空時, front=rear=-1。

隊列的另外一種存儲方式是鏈式存儲,這樣的隊列稱為鏈隊列(LinkedQueue)。由于鏈隊列的操作只是在一端進行,為了操作方便,把隊頭設在鏈表的頭部,并且不需要頭結點。

鏈隊列結點實現

public class Node

{

private T data; //數據域

private Node next; //引用域

//構造器

public Node(T val, Node

p)

{

? data= val;

? next= p;

}

//構造器

public Node(Node p)

{

? next= p;

}

//構造器

public Node(T val)

{

? data= val;

? next= null;

}

//構造器

public Node()

{

? data= default(T);

? next= null;

}

//數據域屬性

public T Data

{

get

{

return data;

}

set

{

data = value;

}

}

//引用域屬性

public Node Next

{

get

{

return next;

}

set

{

next = value;

}

}

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容