#include <stdio.h> #include <stdlib.h> //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; #define OK 1; #define ERROR 0; const int OVERFLOW = -2; //最大队列长度 const int MAXSIZE = 100; //函数返回值类型,为函数结果状态 typedef int Status; //定义队列数据元素类型 typedef char QElemType; //顺序循环队列定义 typedef struct { QElemType *base; //动态分配存储空间 int front; //头指针(下标),若队列不为空,指向队列头元素 int rear; //尾指针(下标),若队列不为空,指向队列尾元素的下一个位置 } SqQueue; //循环队列初始化 Status InitQueue(SqQueue *queue) { queue->base=(QElemType*)malloc(sizeof(QElemType)*MAXSIZE); //分配队列数组空间 if(!queue->base) return OVERFLOW; //分配失败 queue->front=0; queue->rear=0; return OK; } //求循环队列的长度 int QueueLength(SqQueue queue){ return ((queue.rear-queue.front)+MAXSIZE)%MAXSIZE; //采用模运算处理差值为负的情况 } //循环队列入队操作 Status EnQueue(SqQueue *queue,QElemType elem){ if((queue->rear+1)%MAXSIZE==queue->front){ //队满 return ERROR; } else { queue->base[queue->rear]=elem; queue->rear=(queue->rear+1)%MAXSIZE; return OK; } } /* * 注:由于循环队列中,队空和队满的情况均为queue->front==queue->rear; * 为了区分两种情况,有以下几种处理方式: * 1.另设一个标志来区分队空、队满。 * 2.另设一个变量,记录元素个数。 * 3.少用一个元素空间。 * 这里采取第3种方式。那么,队空时:queue->rear==queue->front 、队满时:(queue->rear+1)%MAXSIZE==queue->front */ //循环队列出队操作 Status DeQueue(SqQueue *queue,QElemType *elem){ if(queue->front==queue->rear){ //队空 return ERROR; } else { *elem=queue->base[queue->front]; queue->front=(queue->front+1)%MAXSIZE; return OK; } } //取队头元素 QElemType GetHead(SqQueue queue){ if(queue.front!=queue.rear){ //队列不为空 return queue.base[queue.front]; } else { QElemType null; return null; } } int main(void){ SqQueue queue1; //定义一个队列 //初始化 Status initQueueResult = InitQueue(&queue1); printf("队列queue1初始化结果:%d\n",initQueueResult); //元素入队 QElemType elem1=‘Y‘,elem2=‘C‘; Status enResult = EnQueue(&queue1,elem1); printf("入队执行结果:%d\n",enResult); EnQueue(&queue1,elem2); //将elem2也入队 printf("队尾元素值:%c\n",queue1.base[queue1.rear-1]); //获得队列当前长度 int queueLength = QueueLength(queue1); printf("队列当前长度:%d\n",queueLength); //元素出队 QElemType elem3; //出队的数据放入elem3 Status deResult = DeQueue(&queue1,&elem3); printf("出队执行结果:%d\n",deResult); printf("出队元素值:%c\n",elem3); printf("队尾元素值:%c\n",queue1.base[queue1.rear-1]); //取队头元素 QElemType queueHeadValue = GetHead(queue1); printf("获取队头元素值:%c\n",queueHeadValue); printf("\nEND"); return 0; }
原文:https://www.cnblogs.com/petitepluie/p/14594321.html