/*
* 队列(循环队列)
*写队列前,先来复习一下,队满和队空的条件以及队列的特点
*队满 (rear + 1) % MAXSIZE == front;
*队空 rear == front;
*特点 先进先出(就像排队一样)
*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct //定义一个顺序队列类型
{
int data[MAXSIZE]; //存放顺序队列的数组
int front; // 记录队头元素的位置
int rear; // 记录队尾元素的位置
}SeqQueue;
/* 队列的基本操作
1.初始化队列 InitQueue(Q)
2.判断队列是否为空 EmptyQueue(Q)
3.入队 EnQueue(Q,x)
4.出队 DeQueue(Q,x)
5.取对头元素 GetQueue(Q,x)
6.显示队列的元素 ShowQueue(Q)
*/
void InitQueue(SeqQueue *Q) //初始化队列
{
Q->front = Q->rear = 0; //初始化创建一个空队列,初始化为0
}
int EmptyQueue(SeqQueue *Q) //判断队空
{
if (Q->front == Q->rear) //队列为空
{
return 1;
}
else
return 0;
}
int EnQueue(SeqQueue* Q, int x) //入队
{
//入队前先要判断队列是否已满
if ((Q->rear + 1) % MAXSIZE == Q->front)
{
printf("队列已满,不能入队!");
return 0;
}
else {
Q->rear = (Q->rear + 1) % MAXSIZE; //入队时,队尾指针加1
Q->data[Q->rear] = x;
return 1;
}
}
int DeQueue(SeqQueue* Q, int *x) //出队
{
if (EmptyQueue(Q)) //队列为空
{
printf("队列为空,不可以出队!");
return 0;
}
else {
Q->front = (Q->front + 1) % MAXSIZE; //出队时,头指针加1
*x = Q->data[Q->front];
return 1;
}
}
int GetQueue(SeqQueue* Q, int *x) //取对头元素
{
//先判断队列是否为空
if (EmptyQueue(Q))
{
printf("队列为空,无法取对头元素!");
return 0;
}
else {
*x = Q->data[(Q->front + 1) % MAXSIZE];
return 1;
}
}
void ShowQueue(SeqQueue* Q) //显示队列元素
{
int i=Q->front;
if (EmptyQueue(Q))
{
printf("队空,无元素!");
}
else
{
printf("从对头起队列中各元素为:");
while (i!=Q->rear)
{
printf("%4d",Q->data[i+1]);
i++;
}
}
}
void Menu()
{
printf("\n\n=======队列的基本操作=======");
printf("\n1--初始化队列");
printf("\n2--入队操作");
printf("\n3--出队操作");
printf("\n4--求队头操作");
printf("\n5--取对头元素");
printf("\n6--返回");
printf("\n请输入菜单号(1-6):");
}
//为了提升代码的简洁性,我把main函数(主方法)写在自定方法的下面,就不用去声明它了
int main()
{
SeqQueue Q;
int n=1; //循环条件
int m; //选择操作
int x,y; // x元素个数 y元素值
int flag; //记录操作的成功和失败
while (n == 1)
{
Menu(); //直接调用,不用去声明
scanf_s("%d",&m);
switch (m)
{
case 1:
InitQueue(&Q);
printf("队的初始化完成!");
break;
case 2:
printf("请输入要入队的元素个数:");
scanf_s("%d",&x);
printf("请输入%d个入队的整数:",x);
for (int i = 0; i < x; i++)
{
scanf_s("%d",&y);
flag=EnQueue(&Q, y);
}
if (flag == 1)
printf("入队成功!");
else
printf("入队失败!");
break;
case 3:
printf("请输入要出队的元素个数:");
scanf_s("%d",&x);
printf("出队的元素顺序依次为:");
for (int i = 0; i < x; i++)
{
flag = DeQueue(&Q,&y);
printf("%4d",y);
}
if (flag == 1)
printf("\n出队成功!");
else
printf("出队失败!");
break;
case 4:
flag=GetQueue(&Q, &y);
if(flag==1)
printf("当前对头元素为:%d", y);
break;
case 5:
ShowQueue(&Q);
break;
case 6:
n = 0;
break;
default:printf("输入错误,请输入1~6进行选择!");
}
}
return 0;
}
效果图: