佇列(
queue
)佇列是一種先進先出(
first in first out
,fifo
)的線性表。它只允許在表的一端(隊尾/rear)插入元素,而在另一端(隊頭/front)刪除元素。插入操作稱為入隊或進隊,刪除操作稱為出隊或離隊。佇列示意圖如下:
順序隊佇列的順序儲存結構需要使用乙個陣列和兩個整型變數來實現,陣列用於儲存佇列中的所有元素,兩個整型變數分別用於儲存隊頭元素和隊尾元素的下標位置,分別稱為隊頭指標和隊尾指標。
假定佇列的元素個數不超過maxsize,所有的元素的資料型別都是elemtype,則順序佇列型別sqqueue定義如下:
typedefstruct
sqqueue;
在順序佇列*q中,隊空的條件是q->front==q->rear;隊滿的條件是q->rear==maxsize-1;元素e入隊的操作是先將隊尾指標加1,然後將元素e放入隊尾;出隊操作是先將隊頭指標加1,然後取出隊頭處的元素;隊尾指標總是指向當前佇列中的隊尾元素,而隊頭指標總是指向當前佇列中隊頭元素的前乙個位置。
順序隊的基本運算實現如下:
#include#include#define maxsize 20 //佇列元素最大個數
typedef char elemtype; //佇列元素型別
typedef struct //順序隊
sqqueue;
void initqueue(sqqueue *&q) //初始化佇列
void destoryqueue(sqqueue *&q) //銷毀佇列
bool queueempty(sqqueue *q) //判斷佇列是否為空
bool queuefull(sqqueue *q) //判斷佇列是否已滿
bool enqueue(sqqueue *&q, elemtype e) //入隊(插入元素)
bool dequeue(sqqueue *&q, elemtype &e) //出隊(刪除元素)
int main()
2、
環形佇列
將陣列的前端和後端連線起來,形成環形的順序表——環形佇列。環形佇列的基本運算實現如下:
#include#include#define maxsize 10 //佇列元素最大個數
typedef char elemtype; //佇列元素型別
typedef struct //環形佇列
qutype;
void initqueue(qutype *&qu) //初始化佇列
void destoryqueue(qutype *&qu) //銷毀佇列
bool queueempty(qutype *&qu) //判斷佇列是否為空
bool queuefull(qutype *&qu) //判斷佇列是否已滿
bool enqueue(qutype *&qu, elemtype e) //入隊
bool dequeue(qutype *&qu, elemtype &e) //出隊
int main()
3、
鏈隊
佇列的鏈式儲存結構通過由結點構成的單鏈表實現,此時只允許在單鏈表的表頭進行刪除操作和在單鏈表的表尾進行插入操作,因此需要兩個指標:隊首指標front和隊尾指標rear。用front指向隊首結點,用rear指向隊尾結點。用於儲存佇列的單鏈表成為鏈隊。鏈隊(帶頭結點)中資料結點的型別qnode定義如下:
typedefstruct qnode
qnode; //鏈隊資料結點型別定義
鏈隊結點的型別linkqueue定義如下:
typedefstruct
linkqueue; //鏈隊型別定義
鏈隊的基本運算實現如下:
#include#includetypedef char elemtype;
typedef struct qnode
qnode; //資料結點
typedef struct
linkqueue; //鏈隊結點
void initqueue(linkqueue *&q) //初始化鏈隊
p->next=null;
q=(linkqueue *)malloc(sizeof(linkqueue)); //分配鏈隊結點空間
if(!q)
q->front=q->rear=p;
}void destoryqueue(linkqueue *&q) //銷毀鏈隊
free(p);
}bool queueempty(linkqueue *q) //判斷佇列是否為空
void enqueue(linkqueue *&q, elemtype e) //入隊
p->data=e;
p->next=null;
q->rear->next=p;
q->rear=p;
}bool dequeue(linkqueue *&q, elemtype &e) //出隊
int main()
幾個注意點:1、順序隊和環形佇列的隊空條件均是q->front==q->rear;順序隊的隊滿條件是p->rear==maxsize-1,而環形佇列的隊滿條件是q->front==(q->rear+1)%maxsize;
2、順序隊和環形佇列初始化的不同,導致最後儲存空間上的元素不一樣。順序隊的初始化:q->front=q->rear=-1,所以元素從q->data[0]開始儲存;而環形佇列的初始化:q->front=q->rear=0,所以元素從q->data[1]開始儲存,q->data[0]空閒;
3、順序佇列滿足隊滿條件時可能是假溢位(如p->rear==maxsize-1,此時即使出隊幾個資料仍然滿足了隊滿條件,但已經騰出了若干個空間,此時就是假溢位),而環形佇列滿足隊滿條件就是沒有多餘的儲存空間了;
4、順序隊中的元素個數是rear-front,環形佇列中的元素個數是(rear-front+maxsize)%maxsize;
5、鏈隊的初始化,建立頭結點的同時,為鏈隊結點分配記憶體空間;
6、出隊時,當刪除最後乙個結點後,尾指標也隨之釋放,所以應該將尾指標重新賦值,指向頭結點。
2023年7月29日星期二
棧和佇列的基本運算實現
編寫乙個程式exp3 6.cpp,求解皇后問題 在n n的方格棋盤上,放置n個皇后,要求每個皇后不同行 不同列 不同左右對角線。要求 1 皇后的個數n由使用者輸入,其值不能超過20,輸出所有的解。2 採用類似於棧求解迷宮問題的方法。include include include include de...
實現環形佇列各種基本運算的演算法
實現環形佇列各種基本運算的演算法 目的 領會環形佇列儲存結構和掌握環形佇列中各種基本運算演算法設計 主要功能 1 初始化佇列q 2 判斷佇列q是否非空 3 依次進隊元素a b c 4 出隊乙個元素,輸出該元素 5 依次進隊元素d e f 6 輸出出隊序列 7 釋放佇列 include include...
佇列的定義及基本運算
1 定義 佇列 queue 是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表 1 允許刪除的一端稱為隊頭 front 2 允許插入的一端稱為隊尾 rear 3 當佇列中沒有元素時稱為空佇列。4 佇列亦稱作先進先出 first in first out 的線性表,簡稱為fifo表。佇列的修...