队列
一、什么是队列?
- 队列是一种先进先出FIFO的一种线性结构,也有链式和顺序之分。
- 入队的一端称为队尾,出队的一端称为对头。
1.顺序队列的设计
这种设计就有一个问题,当队尾走到最后时,需要重新从对头插入数据。所以要将表当成环形处理。
当设计成环形时又出现了一个问题,队列的判空和判满不能用front==rear判断,所以书上规定,在队列中浪费一个空间用来标记,当rear+1和front相等时,表示队列满了。
typedef struct
{
int* base;//指向动态内存开辟的空间;
int front;//头指针,指向队列第一个元素的下标
int rear;//尾指针,指向队尾元素的下一个位置;
}SqQueue,* PSqQueue;
2.顺序队列的基本操作
(1)初始化
void Init_Queue(PSqQueue sq)
{
assert(sq != NULL);
if (sq == NULL)return;
sq->base = (int*)malloc(sizeof(int) * MAXQSIZE);//MAXQSIZE是用宏定义的默认值;
if (sq->base == NULL)return;
sq->front = 0;
sq->rear = 0;
}
(2)判空
bool IsEmpty(PSqQueue sq)
{
assert(sq != NULL);
if (sq == NULL)return false;
return sq->front == sq->rear;
}
(3)判满
有两种方法可以判满:
- 计数器原理,增加一个变量用来计数。
- 浪费一个空间用来标记,当rear+1=front时,队列满。
以下用第二种方法实现:
bool IsFull(PSqQueue sq)
{
assert(sq != NULL);
if (sq == NULL)return false;
return (sq->rear + 1) % MAXQSIZE == sq->front;
}
(4)入队
bool Push(PSqQueue sq, int val)
{
assert(sq != NULL);
if (sq == NULL)return false;
sq->base[sq->rear