資料結構複習總結 棧和佇列

2021-10-04 07:40:13 字數 2193 閱讀 1124

二、佇列

一般設初值為top1 = -1(棧空),top2 = n(棧空)

當且僅當top2-top1 = 1時共享棧滿(即兩個棧頂指標相鄰)

設計演算法判斷單鏈表(字元型data域)的全部n個字元是否中心對稱。

ex: xyx, xyyx

思路:利用棧的先進後出的特點,將鍊錶前一半元素依次進棧,然後將棧中元素出棧,與鍊錶的後半元素依次進行比較。

int

dc(linklist l,

int n)

i--;//恢復最後的i值

if(n%2!=

0)//若n為奇數,後移過中心結點

p = p->next;

while

(p!=

null

&& s[i]

=p->data)

if(i =-1

)//空棧

return1;

else

return0;

}

核心思想:棧外字元加入棧內時,要保證棧外字元的優先順序比棧內所有字元的優先順序都要低,否則,彈出棧內優先順序較高的字元,並加入字尾表示式。

步驟

運算子優先順序表

操作符#(

*,/+,-

)棧內優先順序01

536棧外優先順序06

421ex:斐波拉契數列 0 1 1 2 3 5 …

int

fib(

int n)

遞迴必要的兩個條件:

採用非遞迴方式重寫遞迴程式時必須使用棧。該說法是錯誤的!

ex: 計算斐波拉契數列可用迴圈實現

函式呼叫時,系統要用棧儲存必要的資訊;遞迴次數過多容易造成棧溢位

同樣也是操作受限的線性表,先進先出fifo,從隊尾進隊,從隊頭出隊

佇列分為:

進隊:先送值到隊尾,再將隊尾指標+1

q.data[q.rear]

= x;

rear ++

;

出隊:先取出隊頭元素,再將隊頭指標+1

x = q.data[q.front]

front ++

;

順序佇列存在的問題:會導致上溢位;是一種假溢位,在data陣列中任然存在可以存放陣列的位置

彌補順序佇列的缺點

實際就是乙個同時帶有頭指標和尾指標的單鏈表

頭指標指向隊頭結點,尾指標指向隊尾結點(即單鏈表最後乙個結點,與順序儲存有所不同)

適合於資料元素變動較大的情況,而且不存在佇列滿或者溢位的問題。

linknode *p = q.front->next;

x = p->data;

q.front->next = p->next;

//插入頭節點之後

if(q.rear = p)

//若原佇列中只有乙個結點,刪除後變空,還需修改尾指標

q.rear = q.front;

free

(p);

linknode *s =

(linknode *

) malloc (

sizeof

(linknode));

//建立新結點

s->data = x; s->next =

null

;q.rear->next = s;

//插入到表尾

q.rear = s;

允許兩端都進行入隊和出隊操作的佇列

複習 資料結構 棧和佇列

鏈佇列 include include define elemtype char define maxsize 100 typedef struct node 定義節點型別 snode typedef struct lqueue void initqueue lqueue qu void enque...

資料結構複習 棧和佇列

棧是一種只能在一端進行插入或刪除操作的線性表 棧的最主要特點是後進先出 lifo n個不同的元素進棧,其出棧次序總數為 catalan number c 2n nn 1 frac n 1c2n n typedef elemtype int typedef struct 共享棧 如果要用到兩個相同型別...

資料結構複習 棧和佇列 1 棧

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