队列的定义
队列是指一种数据结构,结构特点是FIFO(First In First Out),即先入先出。
队列的数据只能尾插头删,因此可以将队列看作排队,一群人排队结账,谁先排队谁先结账。
队列的实现
队列的数据的插入和删除只有尾插和头删,考虑到顺序表头删效率低,选择链表实现队列。虽然链表尾插效率低,但是可以用一个尾指针来提高尾插效率。
队列实现:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int QueueDataType;
typedef struct QueueNode {
QueueDataType data;
struct QueueNode* next;
}QueueNode;
//头指针和尾指针可以写成变量,但是函数传参时会很麻烦,可以写成一个结构体:
typedef struct Queue {
QueueNode* first;
QueueNode* tail;
}Queue;
void QueueInit(Queue* p){
assert(p);
p->first = p->tail = NULL;
}
bool QueueEmpty(Queue* p){
assert(p);
return p->first == NULL;
}
void QueueDestory(Queue* p){
assert(p);
QueueNode* cur = p->first;
QueueNode* next = NULL;
while(cur){
next = cur->next
free(cur);
cur = next;
}
}
void QueuePush(Queue* p, QueueDataType x){
assert(p);
QueueNode* new = (QueueNode*)malloc(sizeof(QueueNode));
if(tem == NULL){
perror("malloc fail");
return;
}
nem->data = x;
nem->next = NULL;
//尾插分两种情况:队列为空或不为空
if(QueueEmpty){
p->first = p->tail = new;
}
else{
p->tail->next = new;
p->tail = new;
}
}
void QueuePop(Queue* p){
assert(p);
//数据删除,队列不能为空
assert(!QueueEmpty(p));
//头删分两种情况:
if(p->first == p->tail){
//队列中只有一个元素
free(p->first);
p->first = p->tail = NULL;
}
else{
//队列中有多个元素
QueueNode* next = p->first->next;
free(p->first);
p->first = next;
}
}
void QueueFront(Queue* p){
assert(p);
assert(!QueueEmpty(p));
return p->first->data;
}
void QueueTail(Queue* p){
assert(p);
assert(!QueueEmpty(p));
return p->tail->data;
}