队列的顺序结构实现
队列遵循的是先进先出的规则,我们使用一个定长数组和队头队尾两个指针来完成这个结构。
顺序结构使用结构体来表示,如下:
#define maxsize 100
typedef struct {
int data[maxsize]; // 定长数组存放队列元素
int front, rear; // 队头队尾指针
}Queue;
我这里实现的队列,front指针是一个队头结点,无意义,front+1所在位置才是队伍第一个元素,有点类似链表的头结点~
这里需要明确几个操作状态:
- 初始化:front = rear = 0;
- 进队:队不满,data[ ++ rear] = value;
- 出队:队非空,data[++front] = value,然后返回元素;
循环队列可以保证充分地利用数组空间。我们使用+1取余的方式来循环 front rear指针。
- front ++ -> front = (front + 1) % maxsize
- rear ++ -> rear = (rear + 1 ) % maxsize
- 长度为 (rear - front ) % maxsize
实现代码如下:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAXSIZE 200
#define ERROR -1
typedef struct QNode* Queue;
typedef struct QNode QNode;
struct QNode{
int data[MAXSIZE];
int rear; // rear所在位置就是刚入队元素的位置
int front; // front的位置表示队头
// 当 rear + 1 % MAXSIZE == front时,队满;
// 当 rear == front 时,队空
// 当删除时,front 向前移动一个位置;
// 当处于边界的时候,可以考虑 + 1 % maxsize 实现循环移动指针的效果。
};
Queue initialQueue(){
Queue Q = (Queue)malloc(sizeof(QNode));
Q->rear=Q->front=0;
return Q;
}
bool addQ(Queue Q,int item){
/*添加元素的方法是:先移动rear指针,然后在rear所指的位置记录数据*/
if(Q->rear + 1 % MAXSIZE == Q->front)