实现循环队列的基本操作。(循环队列最大长度不超过20)
输入若干个整数(以空格分隔,a结束输入),其中0表示做出队操作,不为0的整数为入队元素。
若出队错误输出“error”;
若最后队列为空,则输出“empty”;
若最后队列非空,依次输出队列的全部元素。
问题:输出的全是error,不知道怎么改
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXQSIZE 20
typedef int QElemType; /*队列元素类型*/
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
/*初始化队列*/
int InitQueue(SqQueue *Q)
{
Q->base=(QElemType *)malloc(MAXQSIZE *sizeof(QElemType));
if(!Q->base)
return ERROR;
Q->front=0;
Q->rear=0;
return OK;
}
/*求队长*/
int QueueLength(SqQueue *Q)
{
int a;
a=(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
return a;
}
/*入队*/
int 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;
}
/*出队*/
int DeQueue(SqQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}
/*判队空*/
int QueueEmpty(SqQueue *Q)
{
if(Q->front==Q->rear)
return OK;
else
return ERROR;
}
/*取队头*/
int GetHead(SqQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
return OK;
}
/*销毁队列*/
int DestroyQueue(SqQueue *Q)
{
if(Q->base)
{
Q->rear=Q->front=0;
free(Q->base);
}
return OK;
}
int main()
{
SqQueue q;
int e;
InitQueue(&q);
int i,j;
for(i=0;i<MAXQSIZE;i++)
{
scanf("%d",&e);
if(e='a')
break;
if(e==0)
DeQueue(&q,e);
if(e!=0)
EnQueue(&q,e);
}
if(!DeQueue(&q,e))
{
printf("error");
}
else if(QueueEmpty(&q))
{
printf("empty");
}
else if(!QueueEmpty(&q))
{
for(j=0;j<MAXQSIZE;j++)
{
GetHead(&q,e);
}
}
return 0;
}
先上结果
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXQSIZE 5
typedef int QElemType; /*队列元素类型*/
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
/*初始化队列*/
int InitQueue(SqQueue *Q)
{
Q->base=(QElemType *)malloc(MAXQSIZE *sizeof(QElemType));
if(!Q->base)
return ERROR;
Q->front=0;
Q->rear=0;
return OK;
}
/*求队长*/
int QueueLength(SqQueue *Q)
{
int a;
a=(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
return a;
}
/*入队*/
int 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;
}
/*出队*/
int DeQueue(SqQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}
/*判队空*/
int QueueEmpty(SqQueue *Q)
{
if(Q->front==Q->rear)
return OK;
else
return ERROR;
}
/*取队头*/
int GetHead(SqQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
return OK;
}
/*销毁队列*/
int DestroyQueue(SqQueue *Q)
{
if(Q->base)
{
Q->rear=Q->front=0;
free(Q->base);
}
return OK;
}
int main()
{
SqQueue q;
int e;
InitQueue(&q);
int i,j;
for(i=0;i<MAXQSIZE;i++)
{
scanf("%d",&e);
if(e=='a')
break;
if(e==0)
DeQueue(&q,&e);
if(e!=0)
EnQueue(&q,e);
}
// if(!DeQueue(&q,&e))
// {
// printf("error");
// }
if(QueueEmpty(&q))
{
printf("empty");
}
else
for(j=0;j<MAXQSIZE-1;j++)
{
DeQueue(&q,&e);
printf("%d ",e);
}
return 0;
}
这个代码我改动的有:
首先你传入函数的参数不太对,我给你改了一下,这里大概是指针没学好,你可以私信我或者再学学函数和指针相关的知识,然后就是在你的for循环里你写的if(e='a')是不对的,要写两个等于,不然一输入然后赋值然后就跳出了,队列里没有东西啊
还写了个if(!DeQueue(&q,&e))这个,这个好像没啥用啊,你不是专门写了个判队空的函数么,我看你后面也用了,为啥要先出一个,是害怕输入的都是无效值吗,那我觉得你应该重新写一个,不然你这个假设都是有效的,那不就不行了么,对不,有一个有效的然后出队,出了之后就error了,所以我把它注释了,
还有一个就是if(QueueEmpty(&q))这个和 if(!QueueEmpty(&q))这个这两个不是必然对立么,对不,要么空,要么不空,所以第二个if 可以不写,第一个的else就是第二个if
还有一个就是你最后一个for里面 GetHead(&q,e); 这个我没有看懂,是想输出第一个数吗,还是咋样[笑哭],但是输出第一个数的话为什么要写个循环呢,还有这个for 你要注意,循环队列是以牺牲一个位置来区分队满和队空的,所以你要小于maxsize减一才行
以上就是我个人的观点,我试了一下是可以跑起来的,如果你还有什么问题或者哪里还不理解可以私信我