您的位置:首页 > 编程语言 > C语言/C++

用c语言实现顺序队列(采用标志位解决假溢出问题)

2010-12-30 17:42 253 查看
/*
* 用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=0
q->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;
}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: