隊列的插入操作在表的一端進(jìn)行而其他操作在表的另一端進(jìn)行棧的操作只能在表的一端進(jìn)行棧和隊列成為操作受限的線性表棧(Stack)是操作限定在表的尾端進(jìn)行的線性表乍迄。
表尾稱為棧頂(Top),另一端稱為棧底(Bottom)闯两,當(dāng)棧中沒有數(shù)據(jù)元素時叫空棧(Empty Stack)
重要方法
1.Push()入棧 //添加數(shù)據(jù)
2.Pop()出棧 //刪除數(shù)據(jù)谅将,返回被刪除的數(shù)據(jù)
3.Peek()//取得棧頂?shù)脑丶⒈郏粍h除
4.Clear()//清空所有數(shù)據(jù)
5.Count //取得棧中元素的個數(shù)
棧的接口定義
public interface IStack{
int Count{get;}//求棧中元素個數(shù)
int GetLength();//求棧的長度
bool IsEmpty();//判斷棧是否為空
void Clear();//清空操作
void Push(T item);//入棧操作
T Pop();//出棧操作
T Peek();//取棧頂元素
}
用一片連續(xù)的存儲空間來存儲棧中的數(shù)據(jù)元素(使用數(shù)組)隅熙,這樣的棧稱為順序棧(Sequence Stack)。類似于順序表囚戚,用一維數(shù)組來存放順序棧中的數(shù)據(jù)元素狞洋。棧頂指示器 top 設(shè)在數(shù)組下標(biāo)為 0 的端吉懊, top隨著插入和刪除而變化假勿,當(dāng)棧為空時转培,top=-1浸须。
順序棧的實現(xiàn)
class SeqStack:IStack
???{
? ? ? private T[] data;
???????private int top;
???????public SeqStack(int size)
???????{
??????????? data = new T[size];
??????????? top = -1;
???????}
???????//默認(rèn)構(gòu)造數(shù)組的最大容量為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];
???????}
??? }
棧的另外一種存儲方式是鏈?zhǔn)酱鎯ι局希@樣的棧稱為鏈棧(Linked Stack)肌索。由于鏈棧的操作只是在一端進(jìn)行,為了操作方便晕换,把棧頂設(shè)在鏈表的頭部闸准,并且不需要頭結(jié)點梢灭。
鏈棧的實現(xiàn)
public class Node
{
???private T data; //數(shù)據(jù)域
???private Node next; //引用域
//構(gòu)造器
???public Node(T val, Node p)
???{
???????data = val;
???????next = p;
???}
//構(gòu)造器
???public Node(Node p)
???{
???????next = p;
???}
//構(gòu)造器
???public Node(T val)
???{
???????data = val;
???????next = null;
???}
//構(gòu)造器
???public Node()
???{
???????data = default(T);
???????next = null;
???}
//數(shù)據(jù)域?qū)傩?/p>
???public T Data
???{
???????get { return data; }
???????set { data = value; }
???}
//引用域?qū)傩?/p>
???public Node Next
???{
???????get { return next; }
???????set { next = value; }
???}
}
隊列(Queue)是插入操作限定在表的尾部而其它操作限定在表的頭部進(jìn)行的線性表。把進(jìn)行插入操作的表尾稱為隊尾(Rear)枣接,把進(jìn)行其它操作的頭部稱為隊頭(Front)缺谴。當(dāng)隊列中沒有數(shù)據(jù)元素時稱為空隊列(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();//取隊頭元素
}
用一片連續(xù)的存儲空間來存儲隊列中的數(shù)據(jù)元素,這樣的隊列稱為順序隊列(SequenceQueue)斩狱。類似于順序棧所踊,用一維數(shù)組來存放順序隊列中的數(shù)據(jù)元素概荷。隊頭位置設(shè)在數(shù)組下標(biāo)為 0 的端误证,用 front 表示;隊尾位置設(shè)在數(shù)組的另一端遏考,用rear 表示改鲫。 front 和 rear 隨著插入和刪除而變化。當(dāng)隊列為空時稽亏, front=rear=-1缕题。
隊列的另外一種存儲方式是鏈?zhǔn)酱鎯Γ@樣的隊列稱為鏈隊列(LinkedQueue)瘪松。由于鏈隊列的操作只是在一端進(jìn)行,為了操作方便记罚,把隊頭設(shè)在鏈表的頭部桐智,并且不需要頭結(jié)點烟馅。
鏈隊列結(jié)點實現(xiàn)
public class Node
{
private T data; //數(shù)據(jù)域
private Node next; //引用域
//構(gòu)造器
public Node(T val, Node
p)
{
? data= val;
? next= p;
}
//構(gòu)造器
public Node(Node p)
{
? next= p;
}
//構(gòu)造器
public Node(T val)
{
? data= val;
? next= null;
}
//構(gòu)造器
public Node()
{
? data= default(T);
? next= null;
}
//數(shù)據(jù)域?qū)傩?/p>
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}
//引用域?qū)傩?/p>
public Node Next
{
get
{
return next;
}
set
{
next = value;
}
}
}