2025_2_9 C语言中队列
1.队列(先进先出)
队列也是一种受限制的线性结构
它只能在一端添加元素,在另一端访问,删除元素
(队首插入,队尾删除)
因为链表实现没有数组实现快,所以队列大多数是用数组实现的
queue.h
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define E int
#define CAPACITY 10
typedef struct {
E elements[CAPACITY];//数组
int fornt;//队首
int rear;//队尾
int size;//长度
}Queue;
Queue* queue_create();
void queue_destroy(Queue* q);
bool is_empty(Queue* q);
bool is_full(Queue* q);
bool enqueue(Queue* q, E element);
E dequeue(Queue* q);
E peek(Queue* q);
queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"
Queue* queue_create() {
return calloc(1, sizeof(Queue));
}
void queue_destroy(Queue* q) {
free(q);
}
bool is_empty(Queue* q) {
return q->size == 0;
}
bool is_full(Queue* q) {
return q->size == CAPACITY;
}
bool enqueue(Queue* q, E element) {
if (is_full(q)) {
printf("error:Queue is full\n");
exit(1);
}
q->elements[q->rear] = element;
q->rear = (q->rear + 1) % CAPACITY;
q->size++;
return true;
}
E dequeue(Queue* q) {
if (is_empty(q)) {
printf("error:Queue is emppty\n");
exit(1);
}
E ele = q->elements[q->fornt];
q->fornt = (q->fornt + 1) % CAPACITY;
q->size--;
return ele;
}
E peek(Queue* q) {
if (is_empty(q)) {
printf("error: Queue is empty\n");
exit(1);
}
return q->elements[q->fornt];
}
main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"
int main() {
Queue* q = queue_create();
if (q == NULL) {
printf("realloc failed in queue_create()\n");
exit(1);
}
enqueue(q, 1);
enqueue(q, 2);
enqueue(q, 3);
enqueue(q, 4);
while (!is_empty(q)) {
E ele = peek(q);
printf("%d ", ele);
dequeue(q);
}
printf("\n");
return 0;
}