文章目录
- 1. 队列介绍
- 2.队列代码实现(C语言)
往期相关文章推荐:
1.栈之浅谈数组和链表实现栈各自的优缺点
2.线性表之链表
3.线性表之顺序表
1. 队列介绍
队列是一种特殊的线性表,只允许在队尾插入数据,在队头删除数据,和日常生活中的排队一样,因此队列具有先进先出FIFO(First In First Out)的特点。
队列可以用数组和链表的结构实现。使用链表的结构实现更优一些,入队列在链表尾端插入,出队列在头部删除,效率很高;如果使用数组的结构,出队列是在数组头上出数据,也就是删除数组第一个元素,效率会比较低,后面所有数据需要向前挪动。
另外还有一种循环队列也可以使用数组或循环链表实现。
2.队列代码实现(C语言)
Queue.h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef int valuetype;
typedef struct QueueNode {
valuetype val;
struct QueueNode* next;
} QueueNode;
typedef struct Queue {
int size;
QueueNode* front;
QueueNode* rear;
} Queue;
void Init(Queue* queue);
void Push(Queue* queue, valuetype val);
void Pop(Queue* queue);
valuetype Front(Queue* queue);
valuetype Rear(Queue* queue);
int Size(Queue* queue);
bool Empty(Queue* queue);
void Destroy(Queue* queue);
Queue.c
#include "Queue.h"
void Init(Queue* queue) {
assert(queue);
queue->size = 0;
queue->front = NULL;
queue->rear = NULL;
}
void Push(Queue* queue, valuetype val) {
assert(queue);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if (newnode == NULL) {
perror("Push(Queue*, valuetype) malloc failed.");
return;
}
newnode->val = val; newnode->next = NULL;
if (queue->size == 0) {
queue->front = queue->rear = newnode;
}
else {
queue->rear->next = newnode;
queue->rear = newnode;
}
queue->size++;
}
void Pop(Queue* queue) {
assert(queue && queue->size > 0);
QueueNode* newfront = queue->front->next;
free(queue->front);
queue->front = newfront;
queue->size--;
if (queue->size == 0) {
queue->rear = NULL;
}
}
valuetype Front(Queue* queue) {
assert(queue && queue->size > 0);
return queue->front->val;
}
valuetype Rear(Queue* queue) {
assert(queue && queue->size > 0);
return queue->rear->val;
}
int Size(Queue* queue) {
assert(queue);
return queue->size;
}
bool Empty(Queue* queue) {
assert(queue);
return queue->size == 0;
}
void Destroy(Queue* queue) {
assert(queue);
QueueNode* node = queue->front;
while (node) {
QueueNode* next = node->next;
free(node);
node = next;
}
queue->size = 0;
queue->front = queue->rear = NULL;
}