数据结构里面都学过的,循环队列的结构体建立。将队列的基本操作函数单独编写成头文件,在之后使用时便可直接调用头文件,不必再在函数内编写。同时也编写了对各项功能检验的主函数代码,有需要的转走记得点赞加关注噢。
文件头及结构体定义
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MaxSize 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int QElemType;
typedef int Status;
typedef struct {
QElemType *base; //初始化的动态分配存储空间
int front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
队列初始化
Status InitQueue(SqQueue &Q)
{
Q.base=(QElemType *)malloc(sizeof(QElemType)*MaxSize);
if(!Q.base) return(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
判断是否空队列
Status QueueEmpty(SqQueue Q)
{
if (Q.front == Q.rear)
return OK;
else
return ERROR;
}
判断是否满队
Status QueueFull(SqQueue Q)
{
if ((Q.rear + 1) % MaxSize == Q.front)
return OK;
else
return ERROR;
}
获取队列长度
int QueueLength(SqQueue &Q)
{
if (Q.front == Q.rear)
printf("队列为空!\n");
else
return ((Q.rear - Q.front + MaxSize) % MaxSize);
}
入队
Status EnQueue(SqQueue &Q, QElemType e)
{
if ((Q.rear + 1) % MaxSize == Q.front) //是否满队
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1)%MaxSize;
return OK;
}
出队
Status DeQueue(SqQueue &Q, QElemType &e)
{
if (Q.rear == Q.front) //判断队空
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MaxSize; //队头指针后移
return OK;
}
获取队头元素
Status GetTop(SqQueue &Q, QElemType &e)
{
if (Q.rear == Q.front) //判断是否为空
return ERROR;
e = Q.base[Q.front];
return OK;
}
输出队列元素
void PrintQueue(SqQueue Q)
{
int i;
printf("要打印的队列为:\n");
for (i = Q.front; i < Q.rear;i++)
printf("%d ",Q.base[i]);
printf("\n");
}
以上各个函数可以整理组合为一头文件,此头文件编写成功后,需要验证这些基本操作函数是否能完成功能,完整的功能验证代码如下,
其中使用swith语句可以实现用户交互界面的功能选择表,更加美观。
#include<stdio.h>
#include<stdlib.h>
#include"SqQueue.h"
using namespace std;
int main() {
SqQueue Q;
QElemType e; //插入的元素
QElemType m; //出队的元素
QElemType headelem; //队头元素
int i;
while (1)
{
printf(" 1.队列的初始化\n");
printf(" 2.判断队列为空\n");
printf(" 3.判断队满\n");
printf(" 4.获取队列长度\n");
printf(" 5.入队\n");
printf(" 6.出队\n");
printf(" 7.获取队头元素的值\n");
printf(" 8.打印队列元素\n");
printf("请输入数字(输入负数退出):\n");
scanf("%d", &i);
if(i<0)
break;
if(i>0&&i<9)
{
switch (i)
{
case 1:
//1.队列的初始化
InitQueue(Q);
if (InitQueue(Q))
{
printf("初始化成功!\n");
}
else printf("初始化失败!\n");
system("pause");
break;
case 2:
//2.判断队空
if (QueueEmpty(Q))
printf("队列为空!\n");
else printf("队列不为空!\n");
system("pause");
break;
case 3:
//3.判断队满
if (QueueFull(Q))
printf("队列满!\n");
else printf("队列不满!\n");
system("pause");
break;
case 4:
//4.队列的长度
printf("队列的长度为:%d\n", QueueLength(Q));
system("pause");
break;
case 5:
//5.入队
printf("请输入要入队的元素值:\n");
scanf("%d", &e);
EnQueue(Q, e);
system("pause");
break;
case 6:
//6.出队
DeQueue(Q, m);
printf("出队的元素为:%d\n",m);
system("pause");
break;
case 7:
//7.取队头元素
GetTop(Q, headelem);
printf("队头元素为:%d\n", headelem);
system("pause");
break;
case 8:
//打印队列元素
PrintQueue(Q);
break;
default:
printf("输入错误\n");
break;
}
}
system("cls");
}
}