1. 程式人生 > >【資料結構週週練】005順序佇列與鏈隊 -撲克牌的篩選

【資料結構週週練】005順序佇列與鏈隊 -撲克牌的篩選

沒有找到有關於佇列的經典題目,想到以前一個遊戲,覺得改編一下可以當作一道佇列的程式設計題來做。把這道題與自己的演算法分享給大家,如果大家有更好的演算法,歡迎大家一起交流討論。

由於普通佇列在實現時,採用順序儲存,會浪費掉大量的空間,所以一般在迴圈佇列採用順序儲存,普通佇列採用鏈式儲存。

一、題目

1、程式碼

1、程式碼

一、題目

將撲克牌一個花色按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;
}

2、執行結果