2. 鏈棧
棧的應用
二、佇列
2.鏈式隊
總結棧又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。 而佇列也是一種特殊的線性表,特殊之處在於它只允許在表的前端進行刪除操作,在表的後端進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
初始化棧initstack(&s)
設定乙個空棧s。
壓棧push(&s, e)
將元素e插入棧s中,使x成為棧s的棧頂元素。
出棧pop(&s, &e)
當棧s不空時,由e返回棧頂元素,並從棧中刪除棧頂元素
取棧頂元素gettop(s,&e)
若棧s不空,則由e返回棧頂元素。
(此處傳入函式引數加&的原因).
按照儲存關係分類,棧可以分為順序棧和鏈棧
概念棧的順序儲存結構簡稱為順序棧。通常由乙個一維陣列和乙個記錄棧頂元素位置的變數組成。
結構圖:
型別定義方式
建立乙個結構體,表述當前棧頂,以及棧的基底,加上乙個整型用於表示堆疊最大容量(非空棧的top指標始終在棧頂元素的上乙個!!!)
typedef
struct
sqstack;
結構體用法複習
基本操作函式主體
初始化棧initstack(&s)
函式主體:
#define stack_init_size 100
//預先定義的初始化堆疊的容量
status initstack
(sqstack &s)
壓棧push(&s, e)
插入e為新的棧頂元素
#define stack_increase 10
//儲存空間分配增量
#define stack_init_size 100
//預先定義的初始化堆疊的容量
status push
(sqstack &s,selemtype e)
* s.top++
=e;return ok;
}
出棧pop(&s, &e)
status pop
(sqstack &s,selemtype &e)
取棧頂元素gettop(s,&e)
if
(s.top == s.base)
return error;
e=*(s.top-1)
;return ok;
概念
棧的鏈式實現是以鍊錶作為棧的儲存結構,並在這種儲存結構上實現棧的基本運算。棧的鏈式實現稱為鏈棧
其結構示意圖如下:
型別定義方式
typedef
struct snode linkstack;
linkstack *top;
鏈棧不同狀態結構圖
鏈棧基本函式
壓棧push(&s, e)
status push
(linkstack *
*top,elemtype e)
出棧pop(&s, &e)
status pop
(linkstack *
*top, elemtype *e)
s=(*top)
->next;
*e=s-
>data;
(*top)
->next=s-
>next;
free
(s);
return ok;
}
取棧頂元素gettop(s,&e)
status gettop
(linkstack *
*top,elemtype *e)
*e=(
*top)
->next-
>data;
return ok;
}
迷宮求解
表示式求值
括號匹配的檢驗
遞迴的實現
佇列也是一種運算受限的線性表。在這種線性表上,插入限定在表的某一端進行,刪除限定在表的另一端進行。允許插入的一端稱為隊尾(rear),允許刪除的一端稱為隊頭(front)。
特點:佇列中資料元素的入隊和出隊過程是按照「先進先出」 的原則進行的。因此,佇列又稱為「先進先出」的線性表,簡稱fifo表。
佇列結構圖如下:
佇列初始化initqueue(&q)
設定乙個空佇列q。
入佇列enqueue(&q,e)
將e插入到佇列q的隊尾。
出隊dequeue(&q,e)
將隊頭元素賦給e,並刪除隊頭元素。
取隊頭元素gethead(q,&e)
由e返回隊頭結點的值。
定義:順序隊是用一維陣列依次存放佇列中的元素和分別指示佇列的首端和佇列的尾端的兩個變數組成。這兩個變數分別稱為「隊頭指標」和「隊尾指標」。結構圖如下:
資料型別定義
#define maxsize 《最大容量》
typedef
struct
squeue;
基本操作函式主體定義
佇列的鏈式儲存結構簡稱為鏈隊。是乙個同時帶有首指標和尾指標的單鏈表。頭指標指向表頭結點,尾指標則指向隊尾元素。
結構圖:
資料型別定義
typedef
struct qnode
qnode,
*queueptr;
typedef
struct
linkqueue;
基本操作函式主體
佇列初始化initqueue(&q)
status initqueue
(linkqueue &q)
入佇列enqueue(&q,e)
status enqueue
(linkqueue &q,qelemtype e)
出隊dequeue(&q,e)
status dequeue
(linkqueue &q,qelemtype &e)
棧和佇列知識內容筆記還未整理完全,棧和佇列的基本函式實體沒有整理完畢,最主要的是他們的應用場景沒有詳細展開。 資料結構筆記 棧和佇列
棧和佇列的特性,乙個是先進後出,乙個是先進先出。對於棧來說,可以通過鍊錶或者陣列來進行實現 對於順序棧來說,如下 順序棧類seqstack的類定義 const int stacksize 10 10是示例性的資料,根據實際問題具體定義 template 定義模板類seqstack class seq...
資料結構筆記 棧和佇列
1 棧1.1 棧基本概念 出棧和入棧 棧的本質是乙個線性表,線性表有兩種儲存形式,那麼棧也有分為棧的順序儲存結構和棧的鏈式儲存結構 最開始棧中不含有任何資料,叫做空棧,此時棧頂就是棧底。資料從棧頂進入,棧頂棧底分高,整個棧的當前容量變大 資料出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小 1.2 ...
資料結構預習筆記(棧和佇列)
1.棧的定義 棧是限制僅在表的一端進行插入和刪除運算的線性表又稱為 後進先出表 lifo表 插入 刪除端稱為棧頂,另一端稱棧底 表中無元素稱空棧。2 棧的邏輯結構和儲存表示 棧的邏輯結構和線性表相同。棧的抽象資料型別有兩種典型的儲存表示 基於陣列的儲存表示和基於鍊錶的儲存表示。1 基於陣列的儲存表示...