队列是一种特殊的表,它限制插入只能在队尾,删除只能从队头删除。队列ADT的基本操作有enqueue(入队,从队尾),dequeue(出队,从队头)。
队列的循环数组实现:
#include <stdio.h>
#define MaxCapacity 5
typedef struct queue {
int capacity;//队列容量
int size;//队列已有的元素数量
int front;//队头下标
int rear;//队尾下标
int* arr;
}queue;
void MakeEmpty(queue* pq) {//将队列初始化
pq->front = 1;//队头下标-队尾下标=1,且元素数量为0就说明队列为空
pq->rear = 0;
pq->size = 0;
pq->arr = (int*)malloc(sizeof(int) * pq->capacity);
if (pq->arr == NULL) {
printf("内存不足\n");
return NULL;
}
}
queue* CreatQueue() {//创建一个队列
queue* pq = (queue*)malloc(sizeof(queue));
if (pq == NULL) {
printf("内存不足\n");
return NULL;
}
pq->capacity = MaxCapacity;
MakeEmpty(pq);
return pq;
}
int IsEmpty(queue* p) {//判断队列是否为空
if (p->size == 0)
return 1;
return 0;
}
int isfull(queue* p) {//判断队列是否已满
if (p->size == p->capacity)
return 1;
return 0;
}
int succ(queue* p, int index) {//得到下标,因为是循环数组,所以采用取余的方法
index++;
return index % p->capacity;
}
void enqueue(queue* p, int x) {//从队尾入队
if (isfull(p)) {
printf("队列已满\n");
return;
}
p->size++;
p->rear = succ(p, p->rear);
p->arr[p->rear] = x;
}
void Print(queue* p) {//打印队中元素
for (int i = p->front; i < p->front + p->size; i++) {
printf("%d ", p->arr[i % p->capacity]);
}
printf("\n----------------------\n");
}
void dequeue(queue* p) {//从队头出队
if (IsEmpty(p)) {
printf("队列为空\n");
return;
}
p->size--;
p->front = succ(p, p->front);
}
int Front(queue* p) {//返回队头元素
if (p->size == 0) {
printf("队列为空\n");
return 0;
}
return p->arr[p->front];
}
int FrontAndDe(queue* p) {//返回队头元素并出队
if (p->size == 0) {
printf("队列为空\n");
return 0;
}
int tmp = p->arr[p->front];
p->size--;
p->front = succ(p, p->front);
return tmp;
}
void dispose(queue* p) {//释放队列
if (p != NULL) {
free(p->arr);
free(p);
}
}
int main() {
queue* pq = CreatQueue();
if (IsEmpty(pq)) {
printf("空队列\n");
printf("----------------------\n");
}
//入队
enqueue(pq, 1);
enqueue(pq, 2);
enqueue(pq, 3);
enqueue(pq, 4);
enqueue(pq, 5);
enqueue(pq, 6);
Print(pq);
//出队
dequeue(pq, 1);
dequeue(pq, 2);
dequeue(pq, 3);
enqueue(pq, 9);
Print(pq);
//dequeue(pq, 4);
//dequeue(pq, 5);
//dequeue(pq, 6);
//返回队头元素
int first = Front(pq);
printf("%d\n------------------\n", first);
//返回队头元素并出队
first = FrontAndDe(pq);
printf("%d\n-------------------\n", first);
first = Front(pq);
printf("%d\n------------------\n", first);
dispose(pq);
return 0;
}