佇列基礎及其約瑟夫問題應用

2022-09-11 09:24:11 字數 2750 閱讀 5170

佇列是一種特殊的線性表,是運算受到限制的一種線性表,只允許在表的一端進行插入,而在另一端進行刪除元素的線性表。隊尾(rear)是允許插入的一端。隊頭(front)是允許刪除的一端。空佇列是不含元素的空表。根據這樣的操作。佇列特點是先進先出~

基礎操作**示例:

#include#include

#include

#include

#define max 5

#define true 1

#define ok 1

#define false 0

#define overflow 0typedef

intstatus;

typedef

intqelemtype;

using

namespace

std;

typedef

struct

sqqueue;

status initqueue(sqqueue *q)

status destroyqueue(sqqueue *q)

status clearqueue(sqqueue *q)

status queueempty(sqqueue q)

intqueuelenth(sqqueue q)

status gethead(sqqueue q,qelemtype *e)

status enqueue(sqqueue *q,qelemtype e)

q->base[q->rear]=e;

q->rear = (q->rear+1)%max;

return

ok;}

status dequeue(sqqueue *q,qelemtype *e)

約瑟夫問題是個有名的問題:n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n=6,m=5,被殺掉的順序是:5,4,6,2,3,1。

分析:(1)由於對於每個人只有死和活兩種狀態,因此可以用布朗型陣列標記每個人的狀態,可用true表示死,false表示活。

(2)開始時每個人都是活的,所以陣列初值全部賦為false。

(3)模擬殺人過程,直到所有人都被殺死為止。

注:迴圈入隊時尾指標向前追趕頭指標;出隊時頭指標向前追趕尾指標,造成隊空和隊滿時頭尾指標均相等。因此,無法通過條件front==rear來判別佇列是"空"還是"滿"。可以通過取模來判斷:

完整**:

#include using

namespace

std;

#define true 1

#define false 0

#define ok 1

#define error 0

#define infeasible -1

#define overflow -2typedef

intstatus;

typedef

intelemtype;

typedef

struct

sqqueue;

status initqueue(sqqueue& q,int

n) q.front=q.rear=0

; q.maxsize = n+1;//

maxsize是總人數+1,是為了留出乙個空位置來放置rear

return

ok;}

void

queuetr**erse(sqqueue q)

cout

q.base[q.rear] =e;

q.rear = (q.rear+1)%q.maxsize;

return

ok;}

status dequeue(sqqueue& q,elemtype&e)

e = q.base

[q.front];

q.base[q.front] = 0;//

0代表此位置沒人:

q.front = (q.front+1)%(q.maxsize-1);//

因為此時的maxsize比總的人數大1,前面rear+1了;

return

ok;}

intmain()

initqueue(q,n);

while(i<=n)//

入隊操作

cout

<< "

\n此時的序列順序為:";

queuetr**erse(q);

cout

<< "

\n請輸入第m個人出隊(1<=m<=n):";

cin >>m;

if(m>n || m<1

)

cout

用來記錄剩下的人數

while(count != 1

)

}dequeue(q,e);

while(q.base[q.front] == 0)//

當此時為0的時候,迴圈找到下乙個不為0的位置

cout

<< "

序號:"

<< e << "

出局!\n";

count--;

}dequeue(q,e);

cout

<< "

最後乙個是:

"<< e

}

佇列及其應用

2 1為解決計算機主機與印表機之間速度不匹配問題,通常設定乙個列印資料緩衝區,主機將要輸出的資料依次寫入該緩衝區,而印表機則依次從該緩衝區中取出資料。該緩衝區的邏輯結構應該是?1分 堆疊佇列樹 圖 單位 浙江大學 2 2若已知一佇列用單向鍊錶表示,該單向鍊錶的當前狀態 含3個物件 是 1 2 3,其...

約瑟夫問題及其變形

問題 n個數排乙個圈,從編號1開始刪除,以後每m個數刪一次,問最後乙個被刪除的數。2 n 10000,1 k 10000 includeusing namespace std int main return 0 變形 從第k個數開始刪。includeusing namespace std defin...

佇列實現約瑟夫問題

描述約瑟夫問題 有 只猴子,按順時針方向圍成一圈選大王 編號從 到 從第 號開始報數,一直數到 數到 的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入 後,輸出最後猴王的編號。輸入 每行是用空格分開的兩個整數,第乙個是 n,第二個是 m...