C 資料結構中棧和佇列的一些心得

2021-08-17 12:53:24 字數 4450 閱讀 4727

1.棧和佇列

棧和佇列是兩種非常重要的資料結構,在軟體設計中應用很多。棧和佇列也是線性結構,線性表、棧和佇列這三種資料結構的資料元素以及資料元素間的邏輯關係完全相同,差別是線性表的操作不受限制,而棧和佇列的操作受到限制。棧的操作只能在表的一端進行,佇列的插入操作在表的一端進行而其他操作在表的另一端進行,所以,把棧和佇列稱為操作受限的線性表。

(1)棧

棧(stack)是操作限定在表的尾端進行的線性表。表尾由於要進行插入、刪除等操作,所以它具有特殊的含義,把表尾稱為棧頂(top),另一端是固定的,叫棧底(bottom)。當棧中沒有資料元素時叫空棧(empty stack)。

棧通常的記為:s=(a1,a2,...,an),s是英文單詞stack的第乙個字母。a1為棧底元素,an為棧頂元素。這n個資料元素按照a1,a2,...an的順序依次入棧,而出棧的次序相反,an第乙個出棧,a1最後乙個出棧。所以,棧的操作是按照後進先出(last in first out,簡稱lifo)或先進後出(first in last out,簡稱filo)的原則進行的,因此,棧又稱為lifo表或filo表

bcl中的棧

c#2.0以下版本只提供了非泛型的stack類(儲存object型別)

c#2.0提供了泛型的stack類

重要的方法如下

[1]push()入棧(新增資料)

[2]pop()出棧(刪除資料,返回被刪除的資料)

[3]peek()取得棧頂的資料,不刪除

[4]clear()清空所有資料

屬性->[5]count取得棧中所有資料的個數

例項://使用bcl中的stack類

stackstack = new stack();

stack.push('a');

stack.push('b');

stack.push('c');//棧頂資料

console.writeline("push a b c之後的資料個數:"+stack.count);

char temp = stack.pop();//取得棧頂的資料,並把棧頂的資料刪除

console.writeline("pop之後得到的資料是:"+temp);

console.writeline("pop之後棧中資料的個數:"+stack.count);

char temp2 = stack.peek();//取得棧頂的資料,不刪除

console.writeline("peek之後得到的資料是:"+temp2);

console.writeline("peek之後棧中的資料個數:"+stack.count);

stack.clear();

console.writeline("clear之後棧中資料的個數:"+stack.count);

console.writeline("空棧的時候,取得棧頂的值為:"+stack.peek());//會出現異常(堆疊為空)

//當空棧時不要進行peek和pop操作

*順序棧

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

*鏈棧棧的另外一種儲存方式是鏈式儲存,這樣的棧稱為鏈棧(linked stack)。鏈棧通常用單鏈表來表示,它的實現是單鏈表的簡化。所以,鏈棧結點的結構與單鏈表結點的結構一樣。由於鏈棧的操作只是在一端進行,為了操作方便,把棧頂設在鍊錶的頭部,並且不需要頭結點。

把鏈棧看做乙個泛型類,類名為linkstack。linkstack類中有乙個欄位top表示棧頂指示器。由於棧只能訪問棧頂的資料元素,而鏈棧的棧頂指示器又不能指示棧的資料元素的個數。所以,求鏈棧的長度時,必須把棧中的資料元素乙個個出棧,每齣棧乙個資料元素,計數器就增加1,但這樣會破壞棧的結構。為保留棧中的資料元素,需把出棧的資料元素先壓入另外乙個棧,計算完長度後,再把資料元素壓入原來的棧。但這種演算法的空間複雜度和時間複雜度都很高,所以,以上兩種演算法都不是理想的解決辦法。理想的解決辦法是linkstack增設乙個字段表示鏈棧中結點的個數。

(2)佇列

佇列(queue)是插入操作限定在表的尾部而其他操作限定在表的頭部進行的線性表。把進行插入操作的表尾稱為隊尾(rear),把進行其他操作的頭部稱為隊頭(front)。當佇列中沒有資料元素時稱為空佇列(empty queue)。

佇列通常記為:q=(a1,a2,a3...an),q是英文單詞queue的第乙個字母。a1為隊頭元素,an為隊尾元素。這n個元素是按照a1,a2,...an的次序依次入隊的,出隊的次序與入隊的相同,a1第乙個出隊,an最後乙個出隊。所以,佇列的操作是按照先進先出(first in first out)或後進後出(last in last out)的原則進行的,因此,佇列又稱為fifo表或lilo表。

在實際生活中有許多類似於佇列的例子。比如,排隊取錢,先來的先取,後來的排在隊尾。佇列的操作是線性表操作的乙個子集。佇列的操作主要包括在隊尾插入元素、在隊頭刪除元素、取隊頭的元素和判斷佇列是否為空等。與棧一樣,佇列的運算是定義在邏輯結構層次上的,而運算的具體實現是建立在物理記憶體結構層次上的。因此,把佇列的操作成為邏輯結構的一部分,每個操作的具體實現只有在確定了佇列的儲存結構之後才能完成。佇列的基本運算不是他的全部運算,而是一些常用的基本運算

bcl中的佇列

c#2.0以下版本提供了非泛型的queue類

c#2.0提供了泛型queue類

常用方法:

[1]enqueue()入隊(放在隊尾)

[2]dequeue()出隊(移除隊頭元素,並返回被移除的元素)

[3]peek()取得隊頭的元素,不移除

[4]clear()清空元素

屬性->[5]count獲取佇列容量大小

例項://使用bcl中的佇列

queuequeue = new queue();

//入隊(新增資料)

queue.enqueue(23);//隊頭

queue.enqueue(45);

queue.enqueue(67);

queue.enqueue(89);//隊尾

console.writeline("新增了23 45 67 89之後佇列的大小為:"+queue.count);

//出隊(取得隊頭的資料,並刪除)

int i = queue.dequeue();

console.writeline("取得隊頭的資料為:"+i);

console.writeline("出隊之後,佇列的大小為:"+queue.count);

int j = queue.peek();//取得隊頭的資料,不刪除

console.writeline("peek得到的結果是:"+j);

console.writeline("peek之後佇列的大小為:"+queue.count);

queue.clear();

console.writeline("clear之後佇列的大小為:"+queue.count);

*順序佇列

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

假溢位示例:

null    null    null    null    a5    a6    a7

front                 rear

front=3 rear=4-->迴圈順序佇列

如果再有乙個資料元素入隊就會出現溢位。但事實上佇列中並未滿,還有空閒空間,把這種現象叫做假溢位。這是由於佇列「隊尾入隊頭出」的操作原則造成的。解決假溢位的方法是將順序佇列看成是首尾相接的迴圈結構,頭尾指示器的關係不變,這種佇列叫迴圈順序佇列(circular sequence queue)。

把順序佇列看做是乙個泛型類,類名叫cseqstack,c是英文單詞circular的第乙個字母cseqstack類實現了介面iqueue。用陣列來儲存迴圈順序佇列中的元素,在cseqstack類中用字段data來表示。用字段maxsize表示迴圈順序佇列的容量,maxsize的值可以根據實際需要進行修改,這通過cseqstack類的構造器中的引數size來實現,迴圈順序佇列中的元素由data[0]開始一次順序存放。欄位front表示隊頭,front的範圍是0到maxsize-1.欄位rear表示隊尾,rear的範圍也是0到maxsize-1.如果迴圈隊列為空,front=rear=-1。當執行入隊操作時需要判斷迴圈順序佇列是否已滿,如果迴圈順序佇列已滿,(rear+1)%maxsize==front,迴圈順序佇列已滿不能插入元素。所以,cseqstack類除了要實現介面iqueue中的方法外,還需要實現判斷迴圈佇列是否已滿的成員方法。

*鏈佇列

佇列的另外一種儲存方式是鏈式儲存,這樣的佇列稱為鏈佇列(linked queue)。同鏈棧一樣,鏈佇列通常用單鏈表來表示,它的實現是單鏈表的簡化。所

以,鏈佇列的結點與單鏈表的一樣。

資料結構 棧和佇列 c

標頭檔案 標頭.h include include using namespace std define stack init size 100 define stackincrement 10 define overflow 2 define error 0 define ok 1 define ...

資料結構 C (一)基礎資料結構 1 棧和佇列

棧 1.棧的特性 後進先出 last in first out 2.棧的其他性質 1 動態集合,可以插入 刪除 2 線性不迴圈結構 3.棧的性質推論 1 只有最上面的元素能被彈出 2 只能在最上面放置新元素 3 彈出的元素是最新壓入的 4 元素彈出的順序與壓入的順序相反 注意 利用陣列最為基層儲存結...

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...