参考了部分--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;
}