本文共 2416 字,大约阅读时间需要 8 分钟。
没有找到有关于队列的经典题目,想到以前一个游戏,觉得改编一下可以当作一道队列的编程题来做。把这道题与自己的算法分享给大家,如果大家有更好的算法,欢迎大家一起交流讨论。
由于普通队列在实现时,采用顺序存储,会浪费掉大量的空间,所以一般在循环队列采用顺序存储,普通队列采用链式存储。
将扑克牌一个花色按A,2,3,4,5,6,7,8,9,10,J,Q,K排成一叠,A在最上面,先将一张牌放在最下面,再将一张牌弃掉,重复这两个操作,问最后筛选出的是哪个牌。
如果我们自己用扑克牌玩一下,很简单,最后筛选的是J,用队列怎么实现呢,请往下看:
#define MAXQSIZE 20#include#include 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;}
#include#include 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;}