FIFO队列定义
顺序队列
采用顺序表实现的队列称为顺序队列
- 进队判断是否已满
- 这个队列是否为空,即判断首尾两个指向同一单元
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int front;
int rear;
}sequenxe_quene;
队列初始化
void init(sequence_quene *sq)
{
sq->front=sq->rear=0;
}
判断队列是否为空
int empty(sequence_quene sq)
{
return (sq.front==sq.rear?1:0);
}
void
打印队列的结点值
{
int i;
if(empty(sq))
printf("\n顺序队列是空的")
else
for(i=sq.front;i<sq.near;i++)//对尾的前一个数
printf("%5d",sq。a[i]);
}
取得队列的队首结点值
datatype get(squence_squene sq)
{
if(empty(sq))
{
printf("\n队列是空的,无法获得队首结点值");
exit(1);
}
else
{
return sq.a[sq.front];
}
}
进队操作(插入)
void insert(sequrnce_squene *sq,datatype x)//注意是修改操作,不是引用操作,所以要指针
{
int i;
if(sq->rear==MAXSIZE)
printf("顺序表是满的");
exit(1);
sq->a[sq->rear]=x;//数据放在rear位置
sq->rear=sq->rear+1;//rear加1
//也可以写成 sq->a[sq->rear++]=x;
}
出队(删除操作)
void dele(squence_squene *sq)
{
if(sq->front==sq->rear)
{
printf("\n顺序队列是空的,不能操作");
exit(1)
}
sq->front++;//往后加一个,表示前面的删除了
}
如果出现假溢出现象
使队列首尾相接
循环队列
在入队出队的时候不变,但是当头尾指针指向向量上界(MAXSIZE-1)时,其操作结果是指向向量下界0
if(real+1==MAXSIZE)
rear=0
else rear++
利用模运算可简化为
rear=(rear+1)%MAXSIZE
//当rear<MAXSIZE时,仍为本身,超过取余
-
出现问题:在循环队列中,rear==front
可能为空,可能是满 -
解决方法:
-
第二种方法:
-
循环队列满的条件是
(rear+1)%MAXSIZE==front
- 循环队列空的条件是
- rear==front
循环队列插入操作
void insert(sequrnce_squene *sq,datatype x)//注意是修改操作,不是引用操作,所以要指针
{
if(sq->(real+1)%MAXSIZE==sq->front)
printf("顺序表是满的");
exit(1);
sq->a[sq->rear]=x;//数据放在rear位置
sq->rear=(sq->rear+1)%MAXSIZE;
}
循环队列的删除操作
void dele(squence_squene *sq)
{
if(sq->front==sq->rear)
{
printf("\n顺序队列是空的,不能操作");
exit(1)
}
sq->front==(sq->front+1)%MAXSIZE;//往后加一个,表示前面的删除了
}
练习1
e1进e1出e2e3e4进e4出e3出e5e6进e6e5e1出
C
练习2
D
先进先出,插入的那端为队尾,删除的那端为队首
课后答疑
少用了一个单元,当尾指针+1等于头指针,表示已满