队列(queue)是一种 先进先出(First In First Out, FIFO) 的线性表。
循环顺序队列的C语言实现
头文件
// 循环顺序队列 ----少用一个元素空间
#include<stdio.h>
#include<stdlib.h>
//结果函数状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 5
typedef int Status;// Status--函数的类型,其值是函数结果的状态代码
typedef int QElemType;
typedef struct
{
QElemType *base; //动态分配存储空间
int front; //头指针,若队列不空,指向列头元素
int rear; //尾指针,若队列不空,指向队列尾元素的下一元素
}SqQueue;
循环队列初始化
Status InitQueue(SqQueue *Q) //循环队列初始化
{
Q->base = (QElemType *)malloc(MAXSIZE*sizeof(QElemType)); //分配内存空间
if(!Q->base) exit(OVERFLOW); //存储分配失败
Q->front = Q->rear = 0; //头指针和尾指针置为0, 队列为空
return OK;
}
求循环队列长度
int QueueLength(SqQueue Q) //求队列循环长度
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
清空循环队列
Status ClearQueue(SqQueue *Q) //清空循环队列
{
if(Q->front!=Q->rear) Q->front = Q->rear;
return OK;
}
销毁循环队列
Status DestroyQueue(SqQueue *Q) //销毁循环队列
{
free(Q->base); //删除内存空间
Q->front = Q->rear = 0; // //头指针和尾指针置为0, 队列为空
return OK;
}
输出显示循环队列
void ShowQueue(SqQueue Q) //输出显示循环队列
{
int i = Q.front%MAXSIZE;
while(i!=Q.rear) //队列不为空
{
printf("%d,", Q.base[i]);
i = (i+1)%MAXSIZE;
}
printf("\n");
}
循环队列入队
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; //队尾指针+1
return OK;
}
循环队列出队
Status DeQueue(SqQueue *Q, QElemType *e) //循环队列出队
{
if(Q->front==Q->rear) return ERROR; //队空
*e = Q->base[Q->front]; //保存对头元素
Q->front = (Q->front+1)%MAXSIZE; //对头指针+1
return OK;
}
取队头元素
Status GetHead(SqQueue Q, QElemType *e) //取队头元素
{
if(Q.front!=Q.rear) //队列不为空
{
*e = Q.base[Q.front]; //返回队头元素值,队头指针不变
return OK;
}
else return FALSE;
}
主函数
int main()
{
Status InitQueue(SqQueue *Q); //循环队列初始化
int QueueLength(SqQueue Q); //循环求队列长度
Status ClearQueue(SqQueue *Q); //清空循环队列
Status DestroyQueue(SqQueue *Q); //销毁循环队列
void ShowQueue(SqQueue Q); //输出显示循环队列
Status EnQueue(SqQueue *Q, QElemType e); //循环队列入队
Status DeQueue(SqQueue *Q, QElemType *e); //循环队列出队
Status GetHead(SqQueue Q, QElemType *e); //取队头元素
SqQueue Q;
QElemType e;
InitQueue(&Q);
int i;
for(i=0;i<3;i++)
{
if(EnQueue(&Q,i)) printf("入队成功:%d\n", Q.base[Q.rear-1]);
else
{
printf("队满!!!\n");
break;
}
}
printf("队列长度为:%d\n", QueueLength(Q));
ShowQueue(Q);
DeQueue(&Q, &e);
printf("出队元素为:%d\n", e);
for(i=5;i<9;i++)
{
if(EnQueue(&Q,i)) printf("入队成功:%d\n", Q.base[Q.rear-1]);
else
{
printf("队满!!!\n");
break;
}
}
ShowQueue(Q);
ClearQueue(&Q);
printf("清空,队列长度为:%d\n", QueueLength(Q));
}