資料結構 棧與佇列

2021-10-01 20:18:17 字數 3445 閱讀 5004

1.定義:僅在表尾進行插入與刪除操作的線性表

2.原理:允許插入與刪除的一端稱為棧頂,另一端稱為棧底,不含任何元素稱為空棧;屬於**先出結構(last in first out)

抽象資料型別如下:

adt 棧(stack)

date

同線性表。元素具有相同的型別,相鄰元素間有前驅和後繼的關係

operation

初始化操作,建立乙個空棧;

判斷棧是否為空

判斷棧是否為滿

刪除並返回棧頂元素

將元素壓入棧

3.實現:

(1)順序儲存結構及其實現

棧結構及其定義

#define maxsize 《棧能儲存的最大元素個數》

typedef

struct snode * stack;

struct snode;

初始化操作,建立乙個空棧;

void

initstack

(stack s)

入棧

void

push

(stack s,elenmenttype e)

else

}

出棧

void

pop(stack s,elenmenttype *e)

else

;return;}

}

兩棧共享儲存空間(通過flag判定操作哪乙個棧)87```c

typedef dstack *s;

struct dstack;

//初始化top1=-1;top2=maxsize-1;

入棧

```c

void dpush(dstack s,elementtype e,int flag)

else

}

出棧

void

dpop

(dstack s,elementtype *e,

int flag)

*e=s->date[s->top1--];

}else

if(flag==2)

*e=s->date[s->top2++];

}

(2)鏈式儲存結構及其實現

棧結構及其定義

鏈式結構的堆疊在哪一端進行push pop呢?即棧頂指標應該在鍊錶的哪一頭?

答:因為鍊錶存在頭指標,而棧存在棧頂指標,故將兩者合二為一,故將鍊錶頭部作為棧頂

typedef

struct stacknodestacknode,

*linkstackptr;

//定義鏈式堆疊需要棧頂指標,該指標指向乙個結點

typedef

struct linkstacklinkstack;

入棧

void

push

(linkstack *s,elementtypye e)

出棧

void

pop(linkstack *s,elementtypye *e)

4.應用:

多項式的四則計算:

(1)計算機是通過將多項式字尾表示式中數字扔進堆疊中進行運算;

(2)如何將中綴表示式變為字尾表示式? 將多項式中的符號扔進堆疊;

1.定義:只允許一端(隊尾)進行插入操作,另一端(隊頭)進行刪除的線性表;屬先進先出結構(first in first out)

2.實現

(1)順序儲存實現

由乙個佇列頭位置變數,乙個佇列尾位置變數,乙個一位陣列描述

順序佇列容易出現假溢位現象,即隊尾溢位,但隊頭位置空閒,故採用迴圈佇列(佇列頭尾相接)!

此時如何判定滿?(此時空置乙個元素)

(rear+1)%maxsize==front

如何判定空?

rear==front

如何確定當前佇列長度?

frontrear時:rear+maxsize-front

故總結起來就是

(maxsize-front + rear)%maxsize

順序儲存結構實現形式

typedef

struct qnode*queue;

struct qnode

;//初始化佇列

void

initqueue

(queue q)

//插入

void

addqueue

(queue q,elenmenttype e)

q->date[q->rear]

=e; q->rear=

(q->rear+1)

%maxsize;

return;}

//隊頭刪除

void

addqueue

(queue q,elementtype *e)

*e=q->date[q->front]

; q->front=

(q->front+1)

%maxsize;

return

;}

(2)鏈式儲存實現

鏈式儲存結構的佇列其實就是單鏈表,只不過有一點特殊之處是:不同於普通單鏈表可以在任意位置插入與刪除(位置合法)鏈式儲存結構的佇列只能尾進頭出。

總的來說,如果可以確定佇列的最大值,建議用迴圈佇列,如果不能預估佇列的長度,則用鏈佇列。

typedef

struct qnodeqnode,

*queueptr;

typedef

struct queuelinkqueue;

入佇列

void

enqueue

(linkqueue *q,qelementtype e)

出佇列

void

dequeue

(linkqueue *q,qelementtype *e)

//該佇列有頭結點

資料結構 棧與佇列

題目 1.編寫函式,採用鏈式儲存實現棧的初始化 入棧 出棧操作 2.編寫函式,採用順序儲存實現棧的初始化 入棧 出棧操作 3.編寫函式,採用鏈式儲存實現佇列的初始化 入隊 出隊操作 4.編寫函式,採用順序儲存實現佇列的初始化 入隊 出隊操作 5.編寫乙個主函式,在主函式中設計乙個簡單的選單,分別除錯...

資料結構 棧與佇列

棧的原則是後進先出,即插入與刪除元素均在棧頂進行。獲取棧頂元素 s.top 佇列的原則是先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行。獲取隊頭元素 q.front 思路 用兩個棧,乙個棧用來進隊,乙個棧用來出隊,當資料進入佇列的時候,我們將其壓入乙個棧,當資料出隊的時候,我們將儲存在棧內的資料...

資料結構 棧與佇列

1.順序棧 基本操作 typedef int elemtype 定義 順序棧 typedef struct sqstack 判空 bool stackempty sqstack s 進棧 bool push sqstack s elemtype x 出棧操作 bool pop sqstack s e...