C++队列之动态分配数组

2024-05-09 18:32
文章标签 c++ 数组 队列 动态分配

本文主要是介绍C++队列之动态分配数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 、队列之定义

 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表

      

  (1)允许删除的一端称为队头(Front)。
  (2)允许插入的一端称为队尾(Rear)。
  (3)当队列中没有元素时称为空队列。
  (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
     队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。
 【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。退出队列的次序只能是a1,a2,…,an。

2、队列的基本逻辑运算
1)InitQueue(Q)
     置空队。构造一个空队列Q。

(2)QueueEmpty(Q)
     判队空。若队列Q为空,则返回真值,否则返回假值。

(3) QueueFull(Q)
     判队满。若队列Q为满,则返回真值,否则返回假值。
  注意:
     此操作只适用于队列的顺序存储结构。

(4) EnQueue(Q,x)
     若队列Q非满,则将元素x插入Q的队尾。此操作简称入队。

(5) DeQueue(Q)
     若队列Q非空,则删去Q的队头元素,并返回该元素。此操作简称出队。

(6) QueueFront(Q)
     若队列Q非空,则返回队头元素,但不改变队列Q的状态

那么下面来个示例来展现:

aqueue.h

#ifndef _AQUE_
#define _AQUE_#include <stdio.h>
#include <strings.h>
#include <stdlib.h>#define SIZE 10typedef int data_t;
typedef struct aqueue{data_t data[SIZE];int head;int tail;int num;
}AQUEUE;AQUEUE *creat_aqueue(void);
void init_aqueue(AQUEUE *Q);
int isfull_aqueue(AQUEUE *Q);
int isnull_aqueue(AQUEUE *Q);
void in_aqueue(AQUEUE *Q, data_t data);
data_t out_aqueue(AQUEUE *Q);#endif

aqueue.c

#include "aqueue.h"AQUEUE *creat_aqueue(void)
{AQUEUE *Q = (AQUEUE *)malloc(sizeof(AQUEUE));if(NULL == Q)exit(-1);bzero(Q, sizeof(AQUEUE));Q->head = 0;Q->tail = -1;Q->num = 0;return Q;
}void init_aqueue(AQUEUE *Q)
{bzero(Q, sizeof(AQUEUE));Q->head = 0;Q->tail = -1;Q->num = 0;
}int isfull_aqueue(AQUEUE *Q)
{return Q->num == SIZE?1:0;
}int isnull_aqueue(AQUEUE *Q)
{return Q->num == 0?1:0;
}void in_aqueue(AQUEUE *Q, data_t data)
{Q->tail = (Q->tail+1)%SIZE;Q->data[Q->tail] = data;Q->num++;
}data_t out_aqueue(AQUEUE *Q)
{data_t t = Q->data[Q->head];Q->head = (Q->head+1)%SIZE;Q->num--;return t;
}


main.c

#include "aqueue.h"int main()
{AQUEUE *Q = creat_aqueue();int i = 111;while(!isfull_aqueue(Q))in_aqueue(Q, i--);while(!isnull_aqueue(Q))printf("%d,", out_aqueue(Q));printf("\n");
}

 

缺点:从上面的代码中可以发现使用new 动态分配,对数组而言并不太合理,删除数组的一个元素,需要将余下的元素依次像前面移动,否则需要一些麻烦操作。

那么我们使用链表,是不是更加方便呢?

下一篇将使用C++的链表来解决这个问题!

 

期待将持续更新!

syw_selfimpr新浪微博地址: http://weibo.com/u/2945271402


注:以上代码在ubuntu下的gcc下编译正常运行!vs也可!

这篇关于C++队列之动态分配数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974165

相关文章

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(