两种方法实现队满和队空的判断操作(循环队列)
本周的作业要求:
1.给出循环队列的存储结构定义。
2.完成循环队列的基本操作函数。
1) 初始化循环队列;
2) 建立循环队列;
3) 实现入队和出队操作;
4) 采用下面两种方法实现对满和队空的判断操作:
方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做);
方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做);
方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做);
3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果;
4.程序调试运行并保存输出结果;
5.提交实验作业。
方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做);
#include <cstdio> #include <cstdlib> #include <cstring> #define MAXSIZE 50 typedef struct { char a[MAXSIZE]; int front; int rear; }SeqQueue; int flag=0; void deng(SeqQueue *Q); void duiman(SeqQueue *Q) { printf("队满,插入失败,返回登录界面\n"); deng(Q); } void duikong(SeqQueue *Q) { printf("队空,无元素出队,返回登陆界面\n"); flag=0; deng(Q); } void EnterQueue(SeqQueue *Q,char x) { if((Q->rear +1)%MAXSIZE==Q->front) duiman(Q); Q->a[Q->rear]=x; Q->rear=(Q->rear+1)%MAXSIZE; return; } void DeleteQueue(SeqQueue *Q) { char x; if(Q->front==Q->rear) duikong(Q); x=Q->a[Q->front]; Q->front=(Q->front+1)%MAXSIZE; if(flag==0){ flag=1; DeleteQueue(Q); }else printf("出队的队头元素为%c\n",x); deng(Q); } void ru(SeqQueue *Q) { printf("输入入队元素以$结束\n"); char En[MAXSIZE]; int i; for(i=0;i<MAXSIZE;i++){ scanf("%c",&En[i]); if(En[i]!='$'){ EnterQueue(Q,En[i]); } else break; } printf("入队成功!\n"); deng(Q); } void InitQueue(SeqQueue *Q) { Q->front=Q->rear=0; } void deng(SeqQueue *Q) { printf("1.入队\n"); printf("2.使队头元素出队,并返回它的值\n"); printf("3.退出\n"); int a; scanf("%d",&a); switch(a) { case 1: system("CLS"); ru(Q); case 2: system("CLS"); DeleteQueue(Q); case 3: exit(0); default: printf("输入不合法,请重新输入\n"); deng(Q); } } int main() { SeqQueue Q; InitQueue(&Q); deng(&Q); return 0; }
方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做);
#include <cstdio> #include <cstdlib> #include <cstring> #define MAXSIZE 50 typedef struct { char a[MAXSIZE]; int front; int rear; }SeqQueue; int flag=0,tag=0; void deng(SeqQueue *Q); void duiman(SeqQueue *Q) { printf("队满,插入失败,返回登录界面\n"); deng(Q); } void duikong(SeqQueue *Q) { printf("队空,无元素出队,返回登陆界面\n"); flag=0; deng(Q); } void EnterQueue(SeqQueue *Q,char x) { if(tag==1&&Q->front==Q->rear) duiman(Q); Q->a[Q->rear]=x; Q->rear=(Q->rear+1)%MAXSIZE; return; } void DeleteQueue(SeqQueue *Q) { char x; if(tag==0&&Q->front==Q->rear) duikong(Q); x=Q->a[Q->front]; Q->front=(Q->front+1)%MAXSIZE; if(flag==0){ flag=1; DeleteQueue(Q); }else{ tag=0; printf("出队的队头元素为%c\n",x); } deng(Q); } void ru(SeqQueue *Q) { printf("输入入队元素以$结束\n"); char En[MAXSIZE]; int i; for(i=0;i<MAXSIZE;i++){ scanf("%c",&En[i]); if(En[i]!='$'){ EnterQueue(Q,En[i]); } else break; } tag=1; printf("入队成功!\n"); deng(Q); } void InitQueue(SeqQueue *Q) { Q->front=Q->rear=0; } void deng(SeqQueue *Q) { printf("1.入队\n"); printf("2.使队头元素出队,并返回它的值\n"); printf("3.退出\n"); int a; scanf("%d",&a); switch(a) { case 1: system("CLS"); ru(Q); case 2: system("CLS"); DeleteQueue(Q); case 3: exit(0); default: printf("输入不合法,请重新输入\n"); deng(Q); } } int main() { SeqQueue Q; InitQueue(&Q); deng(&Q); return 0; }