用标志域表示队空队满状态的循环队列的综合操作(**)
描述:在这里插入代码片
要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。
(1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front == Q->rear,满:(Q->rear+1)%MAXSIZE == Q->front。
(2)本题不损失一个空间,全部都得到利用,为此如下定义循环队列类型:
Typedef struct
{ QueueElementType element[MAXSIZE];
int front;
int rear;
int tag;
}SeqQueue;
此时,循环队列空和满的条件分别为: Q->front == Q->rear&&tag == 0 和Q->front == Q->rear&&tag == 1
(3)编写入队函数、出队函数。
(4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define error 0
#define OK 1
#define FALSE -1
#define TRUE 1
#define scanf_s scanf
#define MAXSIZE 10
typedef int SeqQueueElemType;
typedef struct queue{
SeqQueueElemType elem[MAXSIZE];
int front;
int rear;
int tag;
}SeqQueue;
void Initqueue(SeqQueue *bt);
int EnterQueue(SeqQueue *bt,SeqQueueElemType x);
int DeleteQueue(SeqQueue *bt,SeqQueueElemType *x);
int printSeqQueue(SeqQueue *bt,int i);
int main();
void Initqueue(SeqQueue *Q)
{
Q->front=Q->rear=0;
Q->tag=0;
}
int EnterQueue(SeqQueue *Q, SeqQueueElemType x)
{
if(Q->front == Q->rear && Q->tag == 1)
{
printf("操作提示:队已满!");
return error;
}
else
{
Q->elem[Q->rear] = x;
Q->rear = (Q->rear+1) % MAXSIZE;
printf("操作提示:%d 已入队!",x);
if(Q->front == Q->rear)
{
Q->tag = 1;
}
}
}
int DeleteQueue(SeqQueue *Q, SeqQueueElemType *x)
{
if(Q->front == Q->rear && Q->tag == 0)
{
printf("操作提示:队为空!");
return error;
}
else
{
*x = Q->elem[Q->front];
Q->front = (Q->front+1) % MAXSIZE;
printf("操作提示:%d 已出队!",*x);
if(Q->front == Q->rear)
{
Q->tag = 0;
}
}
}
int printSeqQueue(SeqQueue *Q,int count)
{
int n;
if((Q->front==Q->rear)&&(Q->tag==0))
printf("操作提示:队列为空!");
else
{
printf("操作结果:");
for(n=Q->front;count>0;n++)
{
printf("%d ",Q->elem[n]);
count--;
}
}
return TRUE;
}
int main()
{
SeqQueue Q;
int i=1,count=0;
SeqQueueElemType x;
Q.front=Q.rear=0;
Q.tag=0;
while(i)
{
printf("\n*****************");
printf("\n* menue *");
printf("\n*1 入队 *");
printf("\n*2 出队 *");
printf("\n*3 退出 *");
printf("\n*****************\n");
printf("请选择:");
scanf_s("%d",&i);
switch(i)
{
case 1:
printf("请输入数据:");
scanf_s("%d",&x);
EnterQueue(&Q,x);
count++;
if (count>MAXSIZE)
count=MAXSIZE;
break;
case 2:
DeleteQueue(&Q,&x);
count--;
break;
case 3:
printf("操作提示:再见\n");
return 0;
default:
printf("操作提示:选择错误,请重新选择!");
break;
}
}
}
转载于:https://www.cnblogs.com/desola/p/12616375.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)