用c语言实现顺序队列(采用标志位解决假溢出问题)
/* * 用c语言实现顺序队列(采用标志位解决假溢出问题解决假溢出问题) * 添加一个标志位 *(采用的思路是增加一个标志位flag,当入队列的时候设置flag=1,出队列的时候设置flag=0,因为队列满只可能存在于入队列的时候,所以多加一个判断就可以了) */#include<stdio.h>#include<stdlib.h>#include<math.h>typedef struct queue{//用来保存队列中的元素int *a;//队头元素下标int front;//队尾元素下标int rear;//最多容纳的元素个数int max;//标志位int flag;}qu;/* * 初始化顺序队列 */qu *initqueue(int num){qu *q=(qu *)malloc(sizeof(qu));if(q==NULL){printf("create fail\n");exit(1);}q->front=0;q->rear=0;q->max=num;//入队列flag=1否则flag=0q->flag=0;q->a=(int *)malloc(sizeof(int)*num);return q;}/* * 队列是否为空(空:返回0 非空:1) */int isempty(qu *q){//队列为空if((q->front==q->rear)&&q->flag==0)return 0;else return 1;}/* * 入队列 */ void push(qu *q,int value){//队列已满if((q->front==q->rear)&&q->flag==1){printf("队列已满,无法插入!\n");exit(1);}else{q->a[q->rear]=value;q->rear=(q->rear+1)%q->max;q->flag=1;}}/* * 出队列 */int pop(qu *q){if(isempty(q)==0){printf("队列为空,无法出队列!\n");exit(1);}int value=q->a[q->front];q->front=(q->front+1)%q->max;q->flag=0;return value;}/* * 查看队首元素 */int peek(qu *q){if(isempty(q)==0){printf("队列为空,无元素可查!\n");exit(1);}int value=q->a[q->front];return value;}/* * 队列中的元素个数 */int getnum(qu *q){if(isempty(q)==0)return 0;else{int count=(q->rear-q->front+q->max)%q->max;return count;}}int main(){ int num=5;int temp;qu *q=initqueue(num);push(q,1);push(q,2);push(q,3);push(q,4);pop(q);pop(q);pop(q);push(q,5);push(q,6);int count=getnum(q);printf("count=%d\n",count);return 0;}
?