【資料結構週週練】005順序佇列與鏈隊 -撲克牌的篩選
阿新 • • 發佈:2018-12-15
沒有找到有關於佇列的經典題目,想到以前一個遊戲,覺得改編一下可以當作一道佇列的程式設計題來做。把這道題與自己的演算法分享給大家,如果大家有更好的演算法,歡迎大家一起交流討論。
由於普通佇列在實現時,採用順序儲存,會浪費掉大量的空間,所以一般在迴圈佇列採用順序儲存,普通佇列採用鏈式儲存。
一、題目
將撲克牌一個花色按A,2,3,4,5,6,7,8,9,10,J,Q,K排成一疊,A在最上面,先將一張牌放在最下面,再將一張牌棄掉,重複這兩個操作,問最後篩選出的是哪個牌。
如果我們自己用撲克牌玩一下,很簡單,最後篩選的是J,用佇列怎麼實現呢,請往下看:
二、順序迴圈佇列實現
1、程式碼
#define MAXQSIZE 20 #include<iostream> #include<malloc.h> using namespace std; typedef struct { char *base; int front;//隊頭 int rear;//隊尾 }SqQueue; int InitQueue(SqQueue &Q) { Q.base = (char*)malloc(MAXQSIZE * sizeof(SqQueue)); if (!Q.base) { cout << "空間分配失敗" << endl; exit(OVERFLOW); } Q.front = Q.rear = 0; return 1; } int EnQueue(SqQueue &Q,char e) { if ((Q.rear+1)%MAXQSIZE == Q.front)//隊尾的後一個是隊頭,說明佇列已滿,無法入隊。 { cout << "佇列已滿" << endl; exit(OVERFLOW); } Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXQSIZE; return 1; } int DeQueue(SqQueue &Q, char &e) { if (Q.rear == Q.front)//隊尾和隊頭相遇,說明佇列已空,無法出隊。 { cout << "佇列已空" << endl; return 0; } e = Q.base[Q.front]; Q.front = (Q.front + 1) % MAXQSIZE; return 1; } int main(){ char Card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' }; char e; SqQueue Q; InitQueue(Q); for (int i = 0; i < 13; i++) { EnQueue(Q, Card[i]); } while (Q.rear != Q.front) { DeQueue(Q, e); EnQueue(Q, e); DeQueue(Q, e); } cout << "最後篩選出的是:" << e << endl; return 0; }
2、執行結果
三、鏈隊實現
1、程式碼
#include<iostream> #include<malloc.h> using namespace std; typedef struct QNode { char data; struct QNode *next; }QNode,*QueuePtr; typedef struct LinkQueue { QueuePtr front; QueuePtr rear; }LinkQueue; int InitQueue(LinkQueue &Q) { Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q.front) { cout << "空間分配失敗" << endl; exit(OVERFLOW); } Q.front->next = NULL; return 1; } int EnQueue(LinkQueue &Q, char e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if (!p) { cout << "結點分配失敗" << endl; exit(OVERFLOW); } p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return 1; } int DeQueue(LinkQueue &Q, char &e) { if (Q.front == Q.rear) { cout << "佇列已空" << endl; return 0; } QueuePtr p = Q.front->next; e = p->data; Q.front->next = p->next; if (Q.rear == p) Q.rear = Q.front; free(p); return 1; } int main() { char Card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' }; char e; LinkQueue Q; InitQueue(Q); for (int i = 0; i < 13; i++) { EnQueue(Q, Card[i]); } while (Q.rear != Q.front) { DeQueue(Q, e); EnQueue(Q, e); DeQueue(Q, e); } cout << "最後篩選出的是:" << e << endl; return 0; }