我在上一篇博客《C语言实现使用静态数组实现循环队列》中实现了使用静态数组来模拟队列的操作。

因为数组的大小已经被指定。无法动态的扩展。

所以在这篇博客中,我换成动态数组来实现。

动态数组能够不断开辟内存空间。仅仅是会在数组的初始化时有所不同。其它对数组的操作都是一样的。代码上传至 https://github.com/chenyufeng1991/Queue_DynamicArray 。

(1)声明变量

static int *queue;//声明数组
static int maxSize;//数组大小
static int head;//指向头部
static int tail;//指向尾部

(2)初始化队列

//初始化队列
void InitQueue(int size){ maxSize = size;
queue = (int *)malloc(size * sizeof(int));
head = 0;
tail = 0;
}

(3)进队列

//进队列
void EnQueue(int value){
//先推断是否已满
if ((tail + 1) % maxSize == head) {
printf("队列已满。无法插入\n");
}else{
//未满
queue[tail] = value;
tail = (tail + 1) % maxSize;
}
}

(4)出队列

//出队列
int DeQueue(){ int temp;
//先推断是否为空
if (head == tail) {
printf("队列为空。出列失败\n");
}else{ temp = head;
head = (head + 1) % maxSize;
} return temp;
}

(5)推断队列是否为空

//推断队列是否为空
int IsEmpty(){
if (head == tail) {
printf("队列为空\n");
return 1;
} printf("队列不为空\n");
return 0;
}

(6)推断队列是否已满

//推断队列是否已满
int IsFull(){ if ((tail + 1)% maxSize == head) {
printf("队列已满\n");
return 1;
} printf("队列未满\n");
return 0;
}

(7)打印队列元素

//打印队列元素
void PrintQueue(){
for (int i = head; i < tail; i++) {
printf("%d ",queue[i]);
}
printf("\n");
}

(8)測试代码

int main(int argc, const char * argv[]) {

    InitQueue(5);

    EnQueue(2);EnQueue(4);EnQueue(8);EnQueue(1);EnQueue(5);
PrintQueue(); DeQueue();DeQueue();DeQueue();
PrintQueue(); IsEmpty();
IsFull(); return 0;
}

C语言实现使用动态数组实现循环队列的更多相关文章

  1. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  2. C语言基础 - 实现动态数组并增加内存管理

    用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...

  3. 用OC基于数组实现循环队列

    一.简言 使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式).在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnbl ...

  4. C语言实现使用动态数组来构造栈结构

    我在面前一篇博客<C语言实现使用静态数组来构造栈结构>中使用了静态数组来模拟栈的操作.静态数组的大小是在代码中写死的.是存储在用户栈上面的,使用起来不灵活.在这篇博客中我会使用动态数组来构 ...

  5. 纯C语言(C89)实现动态数组

    起因 工作很少接触纯C项目,业余写着玩玩,不断雕琢 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现 完全封装,隐藏结构体细节,不支持栈创建 拷贝存储,轻微性能代价换来易用性 vector ...

  6. 基于数组的循环队列(C++模板实现)

    循环队列使用数组实现的话,简单.方便.之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了.循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列 ...

  7. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...

  8. 三 基于Java动态数组手写队列

    手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...

  9. 数组模拟循环队列(java实现)

    1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...

随机推荐

  1. SwiftUI 官方教程(一)

    完整中文教程及代码请查看 https://github.com/WillieWangWei/SwiftUI-Tutorials   创建和组合 View 此部分将指引你构建一个发现和分享您喜爱地方的 ...

  2. 09-JavaScript高级

    今日知识 1. Dom(文档对象模型) 2. Bom(浏览器对象模型) 3. 总结 Dom 1. 获取id为div1的元素对象. * var result=document.getElementByI ...

  3. Mysql数据类型(一)

    介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/mysql-data- ...

  4. B - Expression

    Problem description Petya studies in a school and he adores Maths. His class has been studying arith ...

  5. ios - masonry第三方库使用自动布局(参考:http://www.cocoachina.com/ios/20141219/10702.html)

    #import "ViewController.h" #import "Masonry.h" #define kWeakSelf(weakSelf) __wea ...

  6. vscode中eslint airbnb的简单配置

    vscode可以直接在扩展中下载安装eslint,然后,还不能用,需要继续如下步骤: 1.npm install -g eslint 安装完后输入"eslint",有东西出来说明安 ...

  7. [Offer收割]编程练习赛35

    有歧义的号码 #include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void ...

  8. 【转载】程序猿转型AI必须知道的几件事!

    历史上AI火过两次,但是最终都已销声匿迹作为结束.这次AI大火的原因:AlphaGo 4比1战胜李世石,相对于一些外行人的恐慌和恐惧,其实很多业内人员在这场世纪之战结束后,都为人类点上了一个大大的赞. ...

  9. ContentProvider 的使用

    1.简单示例:通过ContentProvider暴露数据库,然后读取数据. 2.先加上一个工具类,用来使用copy assets下面的db文件代码如下: public class MyDBOpenHe ...

  10. Module, Package in Python

    1.To put it simple, Module是写好的一系列函数或变量,文件以.py为后缀,可以在其他Module中整体或部分引用. PS: 在Module中[结尾或开头]加入if __name ...