循环队列的基本定义 :
顺序存储结构定义:
typedef struct{
QElemType *base;
int Front,Rear;
}CQueue;
循环队列的基本操作:
1、初始化一个队列
2、清空一个队列
3、判断一个队列是否为空
4、求队列的长度
5、入队列操作
6、出队列操作
7、取队头元素
8、历遍操作
1、初始化一个队列
void InitCQueue(CQueue &Q){
Q.base=new QElemType [QueueSize];
Q.Front=Q.Rear=0;
}
2、清空一个队列
void ClearCQueue(CQueue &Q){
delete [] Q.base;
InitCQueue(Q);
}
3、判断一个队列是否为空
bool QueueEmpty(CQueue Q){
return Q.Front==Q.Rear?true:false;
}
4、求队列的长度
int QueueLength(CQueue Q){
return (Q.Rear-Q.Front+QueueSize)%QueueSize;
}
5、入队列操作
void EnQueue(CQueue &Q,QElemType e){
if((Q.Rear+1)%QueueSize == Q.Front){
printf(\"error !!! Queue is full !!!\");return ;
}
Q.base[Q.Rear]=e;
Q.Rear=(Q.Rear+1)%QueueSize;
}
6、出队列操作
void DeQueue(CQueue &Q,QElemType &e){
if(Q.Front==Q.Rear){
printf(\"error !!! Queue is empty !!!\");return ;
}
e=Q.base[(Q.Front)%QueueSize];
Q.Front=(Q.Front+1)%QueueSize;
}
7、取队头元素
void GetHead(CQueue Q,QElemType &e){
if(Q.Front==Q.Rear){
printf(\"error !!! Queue is empty !!!\");return ;
}
e=Q.base[Q.Front];
}
8、历遍操作
void QueueTraverse(CQueue Q){
for(int i=Q.Front;i!=Q.Rear;i=(i+1)%QueueSize){
printf(\"%d%c\",Q.base[i],(i+1)%QueueSize==Q.Rear?\'\\n\':\' \');
}
}
完整的调试代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define QElemType int
#define QueueSize 11
using namespace std;
typedef struct{
QElemType *base;
int Front,Rear;
}CQueue;
void InitCQueue(CQueue &Q){
Q.base=new QElemType [QueueSize];
Q.Front=Q.Rear=0;
}
void ClearCQueue(CQueue &Q){
delete [] Q.base;
InitCQueue(Q);
}
bool QueueEmpty(CQueue Q){
return Q.Front==Q.Rear?true:false;
}
int QueueLength(CQueue Q){
return (Q.Rear-Q.Front+QueueSize)%QueueSize;
}
void EnQueue(CQueue &Q,QElemType e){
if((Q.Rear+1)%QueueSize == Q.Front){
printf(\"error !!! Queue is full !!!\");return ;
}
Q.base[Q.Rear]=e;
Q.Rear=(Q.Rear+1)%QueueSize;
}
void DeQueue(CQueue &Q,QElemType &e){
if(Q.Front==Q.Rear){
printf(\"error !!! Queue is empty !!!\");return ;
}
e=Q.base[(Q.Front)%QueueSize];
Q.Front=(Q.Front+1)%QueueSize;
}
void GetHead(CQueue Q,QElemType &e){
if(Q.Front==Q.Rear){
printf(\"error !!! Queue is empty !!!\");return ;
}
e=Q.base[Q.Front];
}
void QueueTraverse(CQueue Q){
for(int i=Q.Front;i!=Q.Rear;i=(i+1)%QueueSize){
printf(\"%d%c\",Q.base[i],(i+1)%QueueSize==Q.Rear?\'\\n\':\' \');
}
}
int main()
{
CQueue Q;
InitCQueue(Q);
int e;
if(QueueEmpty(Q)){
for(int i=0;i<10;i++){
//printf(\"%d\\n\",i);
EnQueue(Q,i);
}
}
printf(\"Front : %d Rear : %d\\n\",Q.Front,Q.Rear);
//printf(\"%d\\n\",Q.base[0]);
QueueTraverse(Q);
for(int i=0;i<9;i++){
DeQueue(Q,e);
printf(\"%d %d %d F: %d R: %d\\n\",i,e,QueueLength(Q),Q.Front,Q.Rear);
}
GetHead(Q,e);printf(\"%d\\n\",e);
for(int i=0;i<4;i++){
//printf(\"%d\\n\",i);
EnQueue(Q,i);
}
printf(\"Front : %d Rear : %d\\n\",Q.Front,Q.Rear);
for(int i=0;i<3;i++){
DeQueue(Q,e);
printf(\"%d %d %d F: %d R: %d\\n\",i,e,QueueLength(Q),Q.Front,Q.Rear);
}
ClearCQueue(Q);
if(QueueEmpty(Q)){
printf(\"Front : %d Rear : %d\\n\",Q.Front,Q.Rear);
}
return 0;
}
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。


