資料結構 棧和佇列

2021-10-01 04:41:14 字數 4552 閱讀 2632

佇列定義:棧是一種只能在一端進行插入或刪除操作的線性表。

棧頂:允許進行插入、刪除操作的一端。

棧底:表的另一端。

空棧:棧中沒有資料元素。

進棧/入棧:棧的插入操作。

退棧/出棧:棧的刪除操作。

主要特點:後進先出。

假設棧元素最大不超過maxsize,所有元素都具有同一資料型別elemtype

定義順序棧

typedef

struct

sqstack;

總結:

約定top總指向棧頂元素,初始值為-1

當top=maxsize-1時不能再進棧

進棧top+1,出棧top-1

順序棧4要素:

棧空條件:top=-1

棧滿條件:top=maxsize-1

進棧e操作:top++,將e放在top處

退棧操作:從top處取出元素e,top–

1、初始化棧initstack(&s)

void

initstack

(sqstack *

&s)

2、銷毀棧destroystack(&s)

void

destroystack

(sqstack *

&s)

3、判斷棧是否為空stackempty(s)

bool stackempty

(sqstack *s)

4、進棧push(&s,e)

bool push

(sqstack *

&s,elemtype e)

5、出棧pop(&s,&e)

bool pop

(sqstack *

&s,elemtype &e)

6、取棧頂元素gettop(s,&e)

bool gettop(sqstack *s,elemtype &e)

資料節點定義如下:

typedef

struct linknode

listack;

1、初始化棧initstack(&s)

void

initstack

(listack *

&s)

2、銷毀棧destroystack(&s)

free

(p);

}

3、判斷棧是否為空stackempty(s)

bool stackempty

(listack *s)

4、進棧push(&s,e)

void

push

(listack *

&s,elemtype e)

5、出棧pop(&s,&e)

bool pop

(listack *

&s,elemtype &e)

6、取棧頂元素gettop(s,e)

bool gettop

(listack *s,elemtype &e)

定義:佇列只能選取乙個端點進行插入操作,另乙個端點進行刪除操作

概念:隊尾:進行插入的一端

隊首/隊頭:進行刪除的一端

進隊/入隊:向佇列中插入新元素,新元素進隊後就成為新的隊尾元素

出隊/離隊:元素出隊後,其後繼元素就成為隊首元素

主要特點:先進先出

順序隊型別sqqueue定義如下:

typedef

struct

sqqueue;

總結:約定rear總是指向隊尾元素

元素進隊,rear增1

約定front指向當前隊中隊頭元素的前一位置

元素出隊,front增1

當rear=maxsize-1時不能再進隊

順序隊4要素:

隊空條件:front=rear

隊滿條件:rear=maxsize-1

元素e進隊:rear++;data[rear]=e;

元素e出隊:front++;e=data[front];

缺點:當隊滿條件為真時,隊中可能還有若干空位置。

這種溢位並不是真正的溢位,稱為假溢位。

1、初始化佇列

void

initqueue

(sqqueue *

&q)

2、銷毀佇列

void

destroyqueue

(sqqueue *

&q)

3、判斷佇列是否為空

bool queueempty

(sqqueue *q)

4、進佇列

bool enqueue

(sqqueue *

&q,elemtype e)

5、出佇列

bool dequeue

(sqqueue *

&q,elemtype &e)

4要素:

1、隊空條件:front=rear

2、隊滿條件:(rear+1)%maxsize=front

3、進隊e操作:rear=(rear+1)%maxsize;

4、出隊操作:front=(front+1)%maxsize

1、已知front、rear,求隊中元素個數count:

count=

(rear-front+maxsize)

%maxsize

2、已知front、count,求rear:

rear=

(front+count)

%maxsize

3、已知rear、count,求front:

front=

(rear-count+maxsize)

%maxsize

環形佇列型別:

typedef

struct

qutype;

進隊運算演算法

bool enqueue

(qutype *

&qu,elemtype x)

}

出隊運算演算法:

bool dequeue

(qutype *

&qu,elemtype &x)

}

比較:

1、環形佇列比非環形佇列更有效利用記憶體空間,即環形佇列會重複使用已經出隊元素的空間,不會出現假溢位。

2、如果演算法中需要使用所有進隊元素來進一步求解,此時可以使用非環形佇列。

定義:採用鍊錶儲存的佇列,採用不帶頭節點的單鏈表實現。

組成:1、儲存佇列元素的單鏈表節點

2、指向隊頭和隊尾指標的鏈隊頭節點

單鏈表中資料節點型別qnode

typedef

struct qnode

qnode;

鏈隊中頭節點型別liqueue

typedef

struct

liqueue;

鏈隊4要素:

1、隊空條件:front=rear=null

2、隊滿條件:不考慮

3、進隊e操作:將包含e的節點插入到單鏈表表尾

4、出隊操作:刪除單鏈表首資料節點

1、初始化佇列

void

initqueue

(liqueue *

&q)

2、銷毀佇列

void

destroyqueue

(liqueue *

&q)}

free

(p);

free

(q);

}

3、判斷佇列是否為空

bool queueempty

(liqueue *q)

4、進隊

void

enqueue

(liqueue *

&q,elemtype e)

}

5、出隊

void

dequeue

(liqueue *

&q,elemtype &e)

資料結構 棧和佇列

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

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...

資料結構 棧和佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...