队列的 基本操作
一.原理与方法 循环队列的 插入与 删除
二..程序清单
三.思考
1. 如果循环队列的下标不是从0开始,而是是从1开始,那么头指针加l 的操作应如何修改?
2. 在循环队列中判断队空和队满的条件能否一样,为什么?
3. 用另一种不同与上面算法的方法解决“假上溢”问题。
#include<stdio.h>
# include "stdlib.h"
# include "stdio.h"
# include "time.h"
//函数结果状态代码
# define TURE 1
# define FALSE 0
# define OK 1
# define ERROR 0
# define OVERFLOW -2
# define maxqsize 100
typedef int status;
typedef int qelemtype;
typedef struct{
qelemtype *base;
int front;
int rear;
}sqqueue;
//----------循环队列的基本操作的算法描述--------
status initqueue(sqqueue &Q){
//构造一个空队列Q
Q.base=(qelemtype*)malloc(maxqsize*sizeof(qelemtype));
if(!Q.base) return ERROR;
Q.front=Q.rear=0;
return OK;
}
int queuelength(sqqueue Q){
//返回Q的元素个数,即对列的长度
return (Q.rear-Q.front+maxqsize)%maxqsize;
}
status enqueue(sqqueue &Q,qelemtype e){
//插入元素e为Q的新的队尾元素
if((Q.rear+1)%maxqsize==Q.front) return ERROR; //队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%maxqsize;
return OK;
}
status dequeue(sqqueue &Q,qelemtype &e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK
//否则返回ERROR
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%maxqsize;
return OK;
}
int main()
{
//测试基本操作
int i,e;
sqqueue Q;
initqueue(Q);
printf("\n");
for(i=1;i<=10;i++)
{
e=i;
enqueue(Q,e);
}
printf("the Length of queue is :%d\n",queuelength(Q));
for(i=1;i<=10;i++)
{
dequeue(Q,e);
printf(" %d",e);
}
}