佇列是一種特殊的線性表,是運算受到限制的一種線性表,只允許在表的一端進行插入,而在另一端進行刪除元素的線性表。隊尾(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 usingnamespace
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...