数据结构(一) -- 循环队列数组实现
来源:互联网 发布:手机淘宝新用户注册 编辑:程序博客网 时间:2024/05/21 03:57
队列的描述
队列的主要特征是先进先出(FIFO),这意味着先进入队列的元素将会首先出队,与生活中的排队一样。
循环队列
为了更好的利用资源,在编程时,经常把队列实现为循环队列(不懂自行百度,太多讲解了)。
注:在循环队列中空和满的条件需要注意,本文实例采用牺牲一个位置的实现方式。
循环队列接口定义
int initQueue(queueT *queue, int size); /* 初始化队列,size为队列长度 */int destroyQueue(queueT *queue); /* 销毁队列 */int queueIsEmpty(queueT *queue); /* 队列是否为空 */int queueIsFull(queueT *queue); /* 队列是否为满 */int enqueue(queueT *queue, queueElementT element); /* 入队 */int dequeue(queueT *queue, queueElementT *element); /* 出队 */void queueTraverse(queueT *queue); /* 遍历打印队列中元素 */
循环队列实现
< queue.h >
#ifndef __QUEUE_H__#define __QUEUE_H__typedef int queueElementT;typedef struct { int head; int rear; int size; queueElementT *contents;}queueT;int initQueue(queueT *queue, int size); /* 初始化队列,size为队列长度 */int destroyQueue(queueT *queue); /* 销毁队列 */int queueIsEmpty(queueT *queue); /* 队列是否为空 */int queueIsFull(queueT *queue); /* 队列是否为满 */int enqueue(queueT *queue, queueElementT element); /* 入队 */int dequeue(queueT *queue, queueElementT *element); /* 出队 */void queueTraverse(queueT *queue); /* 遍历打印队列中元素 */#endif
< queue.c >
#include <stdio.h>#include <stdlib.h>#include "queue.h"int initQueue(queueT *queue, int size){ queue->contents = (queueElementT *)malloc(sizeof(queueElementT) * (size + 1)); //由于牺牲了一个位置,所以分配时多分配一个位置 if(queue->contents == NULL) { perror("malloc"); return -1; } queue->head = 0; queue->rear = 0; queue->size = size + 1; return 0;}int destroyQueue(queueT *queue){ free(queue->contents); queue->contents = NULL;} int queueIsEmpty(queueT *queue){ if(queue->head == queue->rear) { return 1; } return 0;}int queueIsFull(queueT *queue){ if(((queue->rear + 1) % queue->size) == queue->head) { return 1; } return 0;}int enqueue(queueT *queue, queueElementT element){ if(queueIsFull(queue)) { printf("queue is full\n"); return -1; } queue->contents[queue->rear % queue->size] = element; queue->rear = (queue->rear + 1) % queue->size; return 0;}int dequeue(queueT *queue, queueElementT *element){ if(queueIsEmpty(queue)) { printf("queue is empty\n"); return -1; } *element = queue->contents[queue->head % queue->size]; queue->head = (queue->head + 1) % queue->size; return 0;}void queueTraverse(queueT *queue) { int i; if(queueIsEmpty(queue)) { printf("queue is empty\n"); return; } i = queue->head; while(1) { printf("%d\n", queue->contents[i]); if((i + 1) % queue->size == queue->rear) { break; } i = (i + 1) % queue->size; }}
github地址(含Makefile和测试代码)
https://github.com/zsirkg/myWorks/tree/master/algorithms_and_data_structures/queue/array
0 0
- 数据结构(一) -- 循环队列数组实现
- 数据结构:队列(循环数组实现)
- 数据结构-循环数组实现队列
- 数据结构 -- 队列 & 循环队列 -- 数组实现
- 数组实现循环队列(一)
- 数据结构代码实现(循环队列的实现,数组)
- 数据结构(java语言描述)-- 队列的循环数组实现
- [数据结构] 队列的循环数组实现
- 数据结构之循环数组实现队列
- 【C++数据结构】数组循环队列的实现
- 在严蔚敏《数据结构(C语言版)》中,不能用动态分配的一维数组来实现循环队列
- 基本数据结构:队列(一:数组实现)
- 《大话数据结构》读书笔记之 队列抽象数据类型(数组实现循环队列)
- 数据结构之队列(设计并实现一个自己的队列:循环数组+扩容策略)
- 队列的数组实现(循环队列)
- 数据结构C语言实现之循环队列----数组形式---简单化
- 数据结构之——基于数组实现的循环队列
- 数组实现循环队列
- 虚拟机体验之QEMU篇
- 线程跟进程的区别
- ICCV研讨会:实时SLAM的未来以及深度学习与SLAM的比较
- input标签file类型,选择多个文件进行上传
- input标签file类型,选择多个文件进行上传
- 数据结构(一) -- 循环队列数组实现
- 处理DrawableRight点击事件
- 反思
- SolrCloud
- nrf2401记录
- Leetcode 第 374 题(Guess Number Higher or Lower)
- 使用 Python 进行稳定可靠的文件操作
- java大数问题
- Convert.ToInt16、Convert.ToInt32和Convert.ToInt64