卡片游戏--循环队列实现

参考了部分--http://blog.youkuaiyun.com/lpp0900320123/article/details/20694409

的代码原理,采用数组实现了循环队列,解决了卡片游戏问题

嵌入式系统中循环队列可以在接收数据时节省空间。

一下是queue.h文件,需要注意的是,在使用模板类时,声明代码和实现代码应该放在同一个文件下,即一个.h文件中,若分开则会报错。

#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
/******************************************************************************

* 以数组方式实现循环队列,而不是链表

* 采用模板类,实现不同类型的循环队列 

* 循环队列长度为固定长度

(1)队列初始化时,front和rear值都为零;
(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;
(3)当队列为空时,front与rear的值相等,但不一定为零;

假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,
则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;
解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,
也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

********************************************************************************/
const int MAX = 10 + 1;
template <class type>

class CycleQueue
{
private:
	type items[MAX];
	int front;
	int rear;

public:

	CycleQueue();

    ~CycleQueue();
	
	bool DeQueue(type *val);
	
	bool EnQueue(type val);

	bool IsEmpty();

	bool IsFull();

	void OutData(type *addr, int len);
};



template <class type>
CycleQueue<type>::CycleQueue()
{
	front = rear = 0;
	memset(items, 0, sizeof(items));
}

template <class type>
CycleQueue<type>::~CycleQueue()
{
}

template <class type>
bool CycleQueue<type>::DeQueue(type *val)
{
	if (IsEmpty())
	{
		return false;
	}
	else
	{
		*val = items[front];
		front = (front + 1) % MAX;
	}
	return true;
}

template <class type>
bool CycleQueue<type>::EnQueue(type val)
{
	if (IsFull())
	{
		return false;
	}
	else
	{
		items[rear] = val;
		rear = (rear + 1) % MAX;
	}
	return true;
}


template <class type>
bool CycleQueue<type>::IsFull()
{
	if (((rear + 1) % MAX) == front)
	{
		return true;
	}
	return false;
}

template <class type>
bool CycleQueue<type>::IsEmpty()
{
	if (rear == front)
	{
		return true;
	}
	return false;
}

template <class type>
void CycleQueue<type>::OutData(type *addr, int len)
{
	int count = 0;
	if (front < rear)
	{
		for (int i = front; i < rear; i++)
		{
			if (count++ >= len)
			{
				break;              //防止内存越界
			}

			addr[count] = item[i];
		}
	}
	else
	{
		for (int i = front; i < MAX; i++)
		{
			if (count++ >= len)
			{
				break;              //防止内存越界
			}
			addr[count] = item[i];
		}
		for (int i = 0; i < rear; i++)
		{
			if (count++ >= len)
			{
				break;              //防止内存越界
			}
			addr[count] = item[i];
		}
	}
}
#endif

卡片游戏问题的主函数部分

#include <stdio.h>
#include "queue.h"

int main()
{
	int val;
	CycleQueue<int> MyQueue;
	for (int i = 0; i < 7; i++)
	{
		MyQueue.EnQueue(i + 1);
	}
	while (MyQueue.IsEmpty() == false)
	{
	    MyQueue.DeQueue(&val);
		printf("%d ",val);

		if (MyQueue.IsEmpty() == true)
		{
			break;
		}
	    MyQueue.DeQueue(&val);
		MyQueue.EnQueue(val);
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值