队列
定义
队列是在一端删除(队头Front),另一端插入的线性表(队尾Top)。
顺序表示
#define MAX 100
typedef int datatype;
typedef struct
{
datatype data[MAX];
int front;//队尾
int rear;//队头
}sequeue;
初始化队列
void InitialQueue(sequeue &sq)
{
sq->front=0;
sq->rear=0;
}
入队
bool Enqueue(datatype x,sequeue &sq)
{
//先判断队列有没有满
if(sq->rear==MAX-1)
{
printf("the queue is full");
return false;
}
sq->data[sq->rear]=x;
sq->top++;
return true;
}
出队
datatype OutQUeue(sequeue &sq)
{
if(sq->rear==sq->front)
{
printf("empty");
exit(-1);
}
datatype t=sq->data[front];
sq->front++;
return t;
}
线性顺序队列的缺点
删除和插入时front和rear都是++,总有一天会到达极限,并且造成巨大浪费。
循环队列
区别队满和队空
队满
进队列的指针rear超前front一圈
(sq->rear+1)%MAX==sq->front;
此时sq->rear还没有数据,因此还剩一个单元的时候就叫满
队空
sq->front==sq->rear;
入队
int EnQueue(datatype x,sequeue &sq)
{
if((sq->rear+1)%MAX==sq->front)
{
printf("FULL");
return false;
}
sq->data[sq->rear]=x;
//格外注意队列++都需要%MAX
sq->rear=(sq->rear+1)%MAX;
return 1;
}
出队
datatype DeQueue(sequeue &sq)
{
datatype x;
if(sq->rear==sq->front)
{
printf("empty");
return 0;
}
x=sq->data[sq->front];
sq->front=(sq->front+1)%MAX;
return x;
}