1.1顺序队列
队列和栈类似,都是运算受限的线性表,只允许在表的一端进行插入,该端称为尾,在另一端进行删除,该端称为头,队列遵循先进先出的原则。
类型定义如下:
typedef struct
{
datatype data[maxsize];
int front;//front指向队头元素前一个的位置
int rear;//对尾元素的位置
}SeQueue;
SeQueue *sq=(SeQueue*)malloc(sizeof(SeQueue));
1.2队列的基本运算
1.2.1循环队列的初始化
只需要队列的头尾指针相等即为空队列。
void InitQueue(SeQueue*&sq)
{
sq=(SeQueue*)malloc(sizeof(SeQueue));
sq->front==sq->rear=0;
}
1.2.2求队列长度
int Length(SeQueue*sq)
{
return (sq->rear-sq->front+maxsize)%maxsize
}
1.2.3入队
int Enqueue(sequeue*sq,datatype x)
{
if((sq->rear+1)%maxsize==sq->front)
{
printf("队列上溢");
return 0;
}
else
{
sq->rear=(sq->rear+1)%maxsize;//取模运算可以解决假上溢问题,不知道为啥,但是就这么用.
sq->data[sq->rear]=x;
return 1;
}
}
1.2.4出队
int Dequeue(sequeue*sq,datatype&x)
{
if(sq->rear==sq->front)
{
printf("队列下溢");
return 0;
}
else
{
sq->front=(sq->front+1)%maxsize;//防止假上溢且将front指针向后移动1
//因为原本的front指向的是队头元素前的一个元素
x=sq->data[sq->front];
return 1;
}
}