循环队列:循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
通过此程序可以实现循环队列初始化,循环队列入队,循环队列出队,判断循环队列是否为空,求循环队列长度,循环队列输出,循环队列销毁,杨辉三角。
代码如下
#include"malloc.h"
#include"stdio.h"
#include"process.h"
typedef char QElemType;
#define MAXQSIZE 100
#define OK 1
#define MAXSIZE 50
#define Error 0
int yes=0;
typedef struct
{
QElemType *base;
int element[MAXSIZE];
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue *Q)
{
Q->base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q->base)
exit(-1);
Q->front =Q->rear=0;
return OK;
}
int queuempty(SqQueue *q)
{
if(q->front==q->rear)
return 1;
else
return 0;
}
int EnterQueue(SqQueue *Q,int x)
{
if((Q->rear+1)%MAXSIZE==Q->front)
return(Error);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE;
return(OK);
}
int DeleteQueue(SqQueue *Q,int *x)
{
if(Q->front==Q->rear)
return(Error);
*x=Q->element[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return (OK);
}
int GetHead(SqQueue *Q,int *x)
{
if(Q->front==Q->rear)
return (Error);
*x=Q->element [Q->front];
return(OK);
}
void YangHuiTriangle()
{
int n;
int i;
int temp;
int x;
int N;
SqQueue Q;
InitQueue(&Q);
EnterQueue(&Q,1);
printf("please input N:");
scanf("%d",&N);
for(n=1;n<=N;n++)
{
EnterQueue(&Q,1);
for(i=1;i<=n-1;i++)
{
DeleteQueue(&Q,&temp);
printf("%6d",temp);
GetHead(&Q,&x);
temp=temp+x;
EnterQueue(&Q,temp);
}
DeleteQueue(&Q,&x);
printf("%6d",x);
EnterQueue(&Q,1);
printf("\n");
}
}
void menu()
{
printf("\t循环队列实验统一界面\t\t\t\n");
printf("*********************************\n");
printf("*请选择命令序号(0-8):\t\t*\n");
printf("*1 创建循环队列:\t\t*\n");
printf("*2 循环队列入队操作:\t\t*\n");
printf("*3 循环队列出队操作:\t\t*\n");
printf("*4 求循环队列长度:\t\t*\n");
printf("*5 判断循环队列是否为空:\t*\n");
printf("*6 循环队列输出:\t\t*\n");
printf("*7 循环队列销毁:\t\t*\n");
printf("*8 杨辉三角:\t\t\t*\n");
printf("*0 程序结束:\t\t\t*\n");
printf("*********************************\n");
}
EnQueue(SqQueue *Q,QElemType e)
{
if((Q->rear+1)%MAXQSIZE==Q->front)
return Error;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}
void Creatqueue(SqQueue *Q)
{
int i,length;
char ch;
printf("请输入队列长度:\n");
scanf("%d",&length);
for(i=0;i<length;i++)
{
printf("请输入队列元素\n");
scanf("%c",&ch);
if((ch=getchar())!='\n')
Q->base[Q->rear]=ch;
Q->rear++;
}
yes=1;
}
QElemType DeQueue(SqQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)
{
printf("此时循环队列已空!\n");
return Error;
}
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return *e;
}
int QueueLength(SqQueue *Q)
{
int length;
length=(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
return length;
}
int DisSqueue(SqQueue *Q)
{
int i;
if(Q->front==Q->rear)
{
printf("此时队列是空列表:\n");
return Error;
}
printf("此时循环队列的元素如下!\n");
for(i=Q->front;i<Q->front+QueueLength(Q);i++)
printf("%2d\t%2c\n",i+1,Q->base[i]);
printf("\n");
return OK;
}
void destoryqueue(SqQueue *q)
{
if(q)
printf("循环队列已被销毁!\n");
free(q->base);
}
int main(void)
{
SqQueue ptr;
int sel;
char ch;
InitQueue(&ptr);
while(1)
{
menu();
printf("请输入命令(0-8):\n");
scanf("%d",&sel);
switch(sel)
{
case 1:if(yes==1)
{
printf("此时表已创建!不能再次创建!\n");
break;
}
else
Creatqueue(&ptr);
break;
case 2:if(yes==0)
{
printf("此时表未创建!不能入队!\n");
break;
}
else
{
printf("请输入队的元素值:");
scanf("%c",&ch);
if((ch==getchar())!='\n')
EnQueue(&ptr,ch);
break;
}
case 3:if(yes==0)
{
printf("此时表未创建!不能出队!\n");
break;
}
else
{
if(ptr.front==ptr.rear)
printf("队列已空!\n");
else
{
ch=DeQueue(&ptr,&ch);
printf("目前出队的元素是%c.\n",ch);
break;
}
}
case 4:if(yes==0)
{
printf("此时表循环队列未创建!不能求其长度!\n");
break;
}
else
{
printf("此时的循环队列长度为:");
printf("%d\n",QueueLength(&ptr));
}
break;
case 5:if(yes==0)
{
printf("此时表未创建!不能判断是否为空!\n");
break;
}
else
{
if(queuempty(&ptr))
printf("此时循环队列为空队列!\n");
else
printf("此时循环队列为非空队列");
}
break;
case 6:if(yes==0)
{
printf("此时循环队列未创建!不能输出!\n");
break;
}
DisSqueue(&ptr);
break;
case 7:if(yes==0)
{
printf("此时循环队列未创建!不能销毁!\n");
break;
}
destoryqueue(&ptr);
break;
case 8:YangHuiTriangle();
break;
case 0:exit(1);
break;
default:printf("输入命令错误!请重新输入:\n");
break;
}
}
return OK;
}