队列的原理
队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)
队列的要点
队列是一种受限的线性结构
它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
(也可以在表的后端进行插入, 表的前端进行删除), 万变不离其宗, 先进先出
现实生活的例子
如:到餐厅打饭,都是高素质的人,所以不存在插队的情况, 先来的先打到饭,就先出去…
排队…排在前面的先出去…
记住队列的原理就行, 先进先出, 怎么改变都是按照这个原理来的
代码实现
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#define MAX_ELEM 10
// 队列的定义
typedef int ELEM;
typedef struct {
ELEM* date; // 动态
// ELEM date[MAX_ELEM]; // 静态
int front; // 头, 进行删除
int rear; // 尾, 进行插入
}Queue;
// 初始化队列
bool initQueue(Queue* q) {
if(!q) return false;
q->date = new ELEM[MAX_ELEM];
if(!q->date) return false;
q->front = q->rear = 0;
return true;
}
// 队列是否为空
static bool empty(Queue* q) {
if(!q) return false;
if(q->front == q->rear) return true;
return false;
}
// 队列是否为满
static bool full(Queue* q) {
if(!q) return false;
if(q->rear == MAX_ELEM) return true;
return false;
}
// 入队 判断元素是否存满
bool EnQueue(Queue* q, ELEM& e) {
if(!q || !q->date) return false;
if(full(q)) return false; //元素已经存满,不能继续存储
q->date[q->rear] = e;
q->rear++;
return true;
}
// 出队 判断是否存在元素
bool DeQueue(Queue* q) {
if(!q || !q->date) return false;
if(empty(q)) return false; // 没有元素
//1. 前移实现出队
for(int i = q->front+1; i < q->rear; i++) {
q->date[i-1] = q->date[i];
}
q->rear--;
//2. 把front往后移动,实现出队
// q->front++; // 这个方法,存在问题, “假溢出”, 解决方法,循环队列
return true;
}
// 获取长度
int length(Queue* q) {
if(!q || !q->date) return -1;
return q->rear - q->front;
}
// 获取首元素
void getElem(Queue* q, ELEM& e) {
if(!q || !q->date) return;
if(empty(q)) return;
e = q->date[q->front];
}
// 清空队列
void clear(Queue* q) {
q->front = q->rear = 0;
}
// 销毁队列
void destroy(Queue* q) {
if(q->date) delete[] q->date;
q->front = q->rear = 0;
}
//遍历
void print(Queue* q) {
if(!q || !q->date) return;
for(int i = q->front; i < q->rear; i++) {
printf("%d ", q->date[i]);
}
printf("\n");
}
int main(void) {
Queue q;
ELEM e;
// 初始化队列
initQueue(&q);
for(int i=0; i<=11; i++) {
// 入队
e = i+1;
if(EnQueue(&q, e)) {
printf("入队成功\n");
} else {
printf("入队失败\n");
}
}
print(&q);
// 2 清空队列
// clear(&q);
// 出队3个元素
for(int i=0; i < 3; i++) {
if(DeQueue(&q)) {
printf("出队成功\n");
} else {
printf("出队失败\n");
}
}
print(&q);
}
这个是没有打开 清空队列那条语句
这个是打开清空队列后的截屏