一.队列的概念
队列是一种先进先出的线性表(栈是先进后出)。它只允许在表的一端进行插入,或者删除元素。
-
进入插入操作的一端称为队尾(rear)(入队列)
-
进行删除操作的一端称为对头(front)(出队列)
-
队列具有先进先出的(FIFO)的特性
二.顺序队列
1.队头不动,出队列时队头后的所有元素向前移动
缺陷:操作时如果是出队列比较多,需要大量搬移元素
队头不动---->大量搬移元素----->时间复杂度为O(n)
2.队头移动,出队列时队头向后移动一个位置
时间复杂度为O(1)
如果再有F,G进行入队列操作,就会出现假溢出问题
缺陷:容易造成队列假溢出
对于假溢出和真溢出的理解:
假溢出:顺序队列因多次入队列和出队列操作后出现的尚有存储空间但是不能在进入队列操作的溢出
真溢出:顺序队列最大存储空间已经存满但是还要进行入队列操作所引起的溢出
队列满条件:队尾指针=size(设队列当前容量为size)
队列空条件:队头指针=队尾指针
queue.h
#pragma once #include<stdio.h> #include<Windows.h> #include<assert.h> typedef int DataType; #define SIZE 10 typedef struct Queue { DataType arry[SIZE]; int front; int rear; }Queue; //初始化队列 void QueueInit(Queue* q); // 入队列 void QueuePush(Queue* q, DataType data); // 出队列 void QueuePop(Queue* q); // 获取队列顶元素 DataType QueueTop(Queue* q); // 获取队列中元素个数 int QueueSize(Queue* q); // 检测队列是否为空 int QueueEmpty(Queue* q); //销毁队列 void DestroyQueue(Queue* q); //打印队列 void printQueue(Queue* q);
queue.c
#include"queue.h" //初始化队列 void QueueInit(Queue*q) { //初始化队列只需让队头指针和队尾指针都指向0 q->front = q->rear = 0; return; } // 入队列 void QueuePush(Queue* q, DataType data) { assert(q); if (SIZE == q->rear) { printf("栈溢出!!!"); return; } else { q->rear++; q->arry[q->rear] = data; } return; } // 出队列 void QueuePop(Queue* q) { if (q->front == q->rear ) { printf("队列已空!!!"); return; } else q->front++; } // 获取队列顶元素 DataType QueueTop(Queue* q) { if (q->front == q->rear) { printf("队列已空!!!"); return 0; } return (q->arry[q->front]); } // 获取队列中元素个数 int QueueSize(Queue* q) { if (q->front == q->rear) { printf("队列已空!!!"); return 0; } return (q->rear - q->front); } // 检测队列是否为空 int QueueEmpty(Queue* q) { if (q->front == q->rear) printf("队列已空!!!"); return 0; } //销毁队列 void DestroyQeue(Queue* q) { } //打印队列 void printQueue(Queue *q) { if (q->front == q->rear) { printf("队列已空!!!\n"); return; } Queue* p = q; while (p->rear != p->front ) { p->front++; if (p->front < q->front + 1) { printf("%d->", p->arry[p->front]); } else { printf("%d->", p->arry[p->front]); } } printf("\n"); }
test.c
#include"queue.h" void QueueTest() { Queue q; QueueInit(&q); QueuePush(&q, 1); QueuePush(&q, 2); QueuePush(&q, 3); QueuePush(&q, 4); QueuePush(&q, 5); QueuePop(&q); printQueue(&q); } int main() { QueueTest(); system("pause"); return 0; }
后续会更新出循环队列和链式队列的基本操作以及队列的应用