- 使用C语言实现数据结构教程
- 使用C语言实现数据结构 - 首页
- 使用C语言实现数据结构 - 概述
- 使用C语言实现数据结构 - 环境搭建
- 使用C语言实现数据结构 - 算法
- 使用C语言实现数据结构 - 概念
- 使用C语言实现数据结构 - 数组
- 使用C语言实现数据结构 - 链表
- 使用C语言实现数据结构 - 双向链表
- 使用C语言实现数据结构 - 循环链表
- 使用C语言实现数据结构 - 栈
- 使用C语言实现数据结构 - 表达式解析
- 使用C语言实现数据结构 - 队列
- 使用C语言实现数据结构 - 优先队列
- 使用C语言实现数据结构 - 树
- 使用C语言实现数据结构 - 哈希表
- 使用C语言实现数据结构 - 堆
- 使用C语言实现数据结构 - 图
- 使用C语言实现数据结构 - 搜索技术
- 使用C语言实现数据结构 - 排序技术
- 使用C语言实现数据结构 - 递归
- 使用C语言实现数据结构 - 有用资源
- 使用C语言实现数据结构 - 快速指南
- 使用C语言实现数据结构 - 有用资源
- 使用C语言实现数据结构 - 讨论
使用C语言实现数据结构 - 队列
概述
队列是一种类似于栈的数据结构,主要区别在于第一个插入的元素也是第一个被移除的元素(FIFO - 先进先出),而栈是基于LIFO(后进先出)原则的。
队列表示
基本操作
插入/入队 (enqueue) − 将一个元素添加到队列的尾部。
移除/出队 (dequeue) − 从队列的头部移除一个元素。
在本文中,我们将使用数组来实现队列。队列还支持其他一些操作,如下所示。
窥视 (Peek) − 获取队列头部元素。
是否已满 (isFull) − 检查队列是否已满。
是否为空 (isEmpty) − 检查队列是否为空。
插入/入队操作
每当一个元素插入到队列中时,队列都会增加尾部索引以供后续使用,并将该元素存储在存储空间的尾部。如果尾部到达最后一个索引,则会将其环绕到最底部的存储位置。这种安排称为环绕,这样的队列称为循环队列。此方法也称为入队操作。
void insert(int data){ if(!isFull()){ if(rear == MAX-1){ rear = -1; } intArray[++rear] = data; itemCount++; } }
移除/出队操作
每当需要从队列中移除一个元素时,队列会使用头部索引获取该元素并增加头部索引。作为环绕安排,如果头部索引大于数组的最大索引,则将其设置为0。
int removeData(){ int data = intArray[front++]; if(front == MAX){ front = 0; } itemCount--; return data; }
示例
QueueDemo.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> #define MAX 6 int intArray[MAX]; int front = 0; int rear = -1; int itemCount = 0; int peek(){ return intArray[front]; } bool isEmpty(){ return itemCount == 0; } bool isFull(){ return itemCount == MAX; } int size(){ return itemCount; } void insert(int data){ if(!isFull()){ if(rear == MAX-1){ rear = -1; } intArray[++rear] = data; itemCount++; } } int removeData(){ int data = intArray[front++]; if(front == MAX){ front = 0; } itemCount--; return data; } int main() { /* insert 5 items */ insert(3); insert(5); insert(9); insert(1); insert(12); // front : 0 // rear : 4 // ------------------ // index : 0 1 2 3 4 // ------------------ // queue : 3 5 9 1 12 insert(15); // front : 0 // rear : 5 // --------------------- // index : 0 1 2 3 4 5 // --------------------- // queue : 3 5 9 1 12 15 if(isFull()){ printf("Queue is full!\n"); } // remove one item int num = removeData(); printf("Element removed: %d\n",num); // front : 1 // rear : 5 // ------------------- // index : 1 2 3 4 5 // ------------------- // queue : 5 9 1 12 15 // insert more items insert(16); // front : 1 // rear : -1 // ---------------------- // index : 0 1 2 3 4 5 // ---------------------- // queue : 16 5 9 1 12 15 // As queue is full, elements will not be inserted. insert(17); insert(18); // ---------------------- // index : 0 1 2 3 4 5 // ---------------------- // queue : 16 5 9 1 12 15 printf("Element at front: %d\n",peek()); printf("----------------------\n"); printf("index : 5 4 3 2 1 0\n"); printf("----------------------\n"); printf("Queue: "); while(!isEmpty()){ int n = removeData(); printf("%d ",n); } }
输出
如果我们编译并运行上述程序,则会产生以下输出:
Queue is full! Element removed: 3 Element at front: 5 ---------------------- index : 5 4 3 2 1 0 ---------------------- Queue: 5 9 1 12 15 16
广告