编程软件:C-free 5.0
队列:一种特殊的线性表,只允许在表的一端进行插入,另一端进行删除。
队列分:队首(删除的一端,front)、队尾(插入的一端,rear)
✳ 入队时要判断队满:(sq->rear + 1) % MAXSIZE == sq->front;
✳ 出队时要判断队空:sq->rear==sq->front;
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int datatype;
#define MAXSIZE 50 //队列的最大容量
int count1,count2;
//定义队列的结构体
typedef struct
{
datatype data[MAXSIZE];
int front, rear;
}c_SeQueue;
//初始化循环队列
c_SeQueue *Init_SeQueue()
{
c_SeQueue *sq;
sq = (c_SeQueue *)malloc(sizeof(c_SeQueue));
if (!sq)return NULL;
else
{
sq->front = sq->rear = 0;
return sq;
}
}
//入队
int EnQuenu(c_SeQueue *sq, datatype x)
{
if ((sq->rear + 1) % MAXSIZE == sq->front)
{
printf("队列已满,无法入队\n");
return 0;
}
else
{
sq->data[sq->rear]=x;
sq->rear=(sq->rear+1)%MAXSIZE;
printf("\t\t入队成功!\n");
count1++;
}
}
//出队
int DeQueue(c_SeQueue *sq, datatype *x)
{
if(sq->rear==sq->front)
{
printf("队列为空,无法出队\n");
return 0;
}
else
{
*x=sq->data[sq->front];
sq->front=(sq->front+1)%MAXSIZE;
printf(" 出队成功!出队元素是:%d\n",*x);
count2++;
}
}
//判队空
int j=0;
int JudgeExist(c_SeQueue *sq)
{
//int j=0;
if(sq->rear==sq->front)
{
j==1;
printf("队列为空,无法出队\n");
return 0;
}
}
//显示队列
int x;
int Show(c_SeQueue *sq)
{
//判断逻辑
if(sq == NULL)
{
printf("队列无元素\n");
return 0;
}
else
{
x=count1-count2;
for(int i=0;i<x;i++)
{
printf("%d ",sq->data[i]);
}
}
return 0;
}
int main()
{
c_SeQueue *sq;
int j, k;
datatype x;
sq = Init_SeQueue();
do
{
printf("\n\n\n\n");
printf("\t\t\t 队列子系统\n");
printf("\t\t*******************************\n");
printf("\t\t* 1----进 队 列 *\n");
printf("\t\t* 2----出 队 列 *\n");
printf("\t\t* 3----队列空否 *\n");
printf("\t\t* 4----显示队列 *\n");
printf("\t\t* 0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t 请选择菜单项(0-4):");
scanf("%d", &k);getchar();
switch (k)
{
case 1: //进队列
printf("\n 请输入要进队列的数据:");
scanf("%d",&x);
EnQuenu(sq,x);
break;
case 2: //出队列
DeQueue(sq,&x);
break;
case 3: //判断队列空否
JudgeExist(sq);
if (j == 1) printf("此队列为空!!!");
else printf("此队列不空。");
break;
case 4: //显示队列
printf("\n 此队列有数据:");
Show(sq);
}
} while (k != 0);
return 0;
}
课本上的是用了两个指针,第二个指针用在显示队列(show)那里,我不太懂就换了一种方法,定义了两个全局变量count1和count2,count1用来记录进队列的元素个数,count2用来记录出队列的元素个数,然后用 x = count1 - count2来显示剩下队列里的元素,然后然后,,多运行几次,当队列没有元素的时候就有bug了。所以,存储那些时不时要加减的数据时建议用指针链表这些的,比较靠谱。