16,471
社区成员
发帖
与我相关
我的任务
分享
template<typename DATA>
class CQuee
{
public:
CQuee(int count = 10)
{ pArray = new DATA[count];
m_Count = count;
m_head = m_tail = 0;
};
~CQuee(){ delete[]pArray; pArray = 0; };
public:
bool pop(DATA&data)
{
if (isempty())
return false;
data = pArray[m_head];
m_head = ++m_head%m_Count;
return true;
};
bool push(const DATA&data)
{
if (isfull())
return false;
pArray[m_tail] = data;
m_tail = ++m_tail%m_Count;
return true;
};
bool isempty()
{
return m_head == m_tail;
};
bool isfull()
{
return (m_tail + 1) % m_Count == m_head;
};
int size()
{
return (m_tail - m_head + m_Count) % m_Count;
};
private:
DATA*pArray;
int m_Count;
int m_head;
int m_tail;
};
///////////////////////////////////////////////////
// 留了一个 空位置,判断 是否满或空
//circular Queue 循环队列实现
#include "stdafx.h"
#include <stdlib.h>
#define MAXSIZE 100
int buffer[MAXSIZE]; //存储内存分配基地址
int rdIndex=0; //队列头索引
int wtIndex=0; //队列尾索引
// wtIndex 入队列操作
int WriteQueue(int *buffer, int e)
{
if ((wtIndex + 1) % MAXSIZE == rdIndex)
{
return 1; //队列已满时,不执行入队操作
}
//将元素放入队列尾部
buffer[wtIndex] = e;
//尾部元素指向下一个空间位置,取模运算保证了索引不越界(余数一定小于除数)
wtIndex = (wtIndex + 1) % MAXSIZE;
return 0;// ok
}
// rdIndex 出队列操作
int ReadQueue(int *buffer, int *e)
{
if (rdIndex == wtIndex)
{
return 1; //空队列,直接返回
}
//头部元素出队
*e = buffer[rdIndex];
rdIndex = (rdIndex + 1) % MAXSIZE;
return 0;// ok
}
//测试用
int main()
{
int e;
for(int i=0; i< 60;i++)
{
if(WriteQueue(buffer, i))
{
printf("Queue is full!\r\n");
break;
}
}
//
for(int k=0; k< 30;k++)
{
if(ReadQueue(buffer, &e))
{
printf("Queue is empty!\r\n");
break;
}
printf("%d,",e);
}
// more 60=60=120 %100 = 20
for(int ii=0; ii< 60;ii++)
{
if(WriteQueue(buffer, i))
{
printf("Queue is full!\r\n");
break;
}
}
//
printf("\r\n");
printf("wtIndex %d\r\n",wtIndex);// =20
printf("rdIndex %d\r\n",rdIndex);// =30
// 队列长度为rear-front + QueueSize,因此通用的计算队列长度公式为:
int len=(wtIndex - rdIndex + MAXSIZE) % MAXSIZE;//120-30=90
printf("len= %d\r\n",len);
// return=exit
getchar();
return 0;
}