一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种栈的自动增长处理系统及方法与流程

2022-06-08 23:05:35 来源:中国专利 TAG:


1.本发明涉及量子网络与计算机中数据结构领域,尤其涉及一种栈的自动增长处理系统及方法。


背景技术:

2.目前栈的储存方式有两种,分为链栈和顺序栈。链栈是利用单链表的方式实现,因为链表是动态分配空间的,因此栈的存储容量可变,但是需要为每个栈元素分配额外的指针空间用来存放指针域,产生了结构性开销。而且,链栈查询指定位置的元素的时间复杂度为o(n)。顺序栈是利用数组的方式来实现,由于数组在初始化的时候需要声明长度,因此栈的存储容量固定,存在栈满溢出情况。利用数组来进行储存栈元素的时候,需要对数组进行扩缩容量,即假设原数组的长度为len,当内存不足时,需要新建一个大小为2*len的数组;当内存使用不到1/4时,新建一个大小为1/2*len的数组,将原来的数组复制到新数组中,释放原来数组的空间。该方法需要频繁申请新数组以及销毁原数组,而将原数组复制到新数组中,还需要经过o(n)时间,不仅在空间上浪费内存,而且在时间上的花费也不少,导致栈的存储效率低下。
3.因此,有待对量子网络与计算机现有技术的不足进行改进,提出一种解决栈的自动增长问题并且提升栈存储效率的方法。


技术实现要素:

4.本发明的目的是为了克服已有技术的缺陷,为了解决栈的增长和存储效率的问题,提出了一种栈的自动增长处理系统及方法。
5.本发明方法通过下述技术方案实现的:
6.一种栈的自动增长处理系统,包括结构类建立模块、数组建立模块、出栈模块和入栈模块,其中:
7.所述结构类建立模块用于建立一个通用栈的结构类,并设置结构类的成员变量;
8.所述数组建立模块用于构建所述结构类的构造函数并新建第一数组;
9.所述入栈模块用于进行入栈操作,采用所述入栈函数push来计算当前栈尾元素在最后一个数组的位置的值index1;当所述index1的值不等于0时,则将所述元素a入栈,
10.当index1的值等于0,则通过数组建立模块建立第二数组;
11.所述出栈模块用于进行出栈操作,采用出栈函数pop来计算当前栈尾元素b在最后一个数组的位置的值index2,当index2的值不等于1时,将所述栈元素b出栈;
12.当index2的值等于1时,将所述栈元素b出栈,释放最后一个数组地址*lastarray指向的数组并将*lastarray指向倒数第二个数组。
13.一种栈的自动增长处理方法,所述方法的具体步骤如下:
14.步骤1:建立一个通用栈的结构类,并设置结构类的成员变量;
15.所述成员变量包括存放栈元素的第一个数组地址指针*firstarray,存放栈元素
的最后一个数组地址指针*lastarray,每个数组的长度arraylen,当前数组的个数arraynum,当前栈元素的大小size;
16.步骤2:构建所述结构类的构造函数并新建第一数组,第一数组命名为newarray1,将第一数组的地址分别存入到第一个数组地址指针*firstarray和最后一个数组地址指针*lastarray中;
17.步骤3:为所述结构类构建一个入栈函数push与出栈函数pop;
18.步骤4:当任意元素a入栈时,采用所述入栈函数push来计算当前栈尾元素在最后一个数组的位置的值index1,计算公式为:
19.index1=size%(arraylen-1),
20.当所述index1的值不等于0时,则将所述元素a入栈,size值加1;
21.当index1的值等于0,则建立第二数组newarray2并跳转到步骤5;
22.步骤5:地址指针*lastarray移除当前指向的数组并指向第二数组地址,数组的个数arraynum的值加1,size值加1,并将所述入栈元素a赋值给第二数组的第一个元素;
23.步骤6:当栈尾元素b出栈时,采用出栈函数pop来计算当前栈尾元素b在最后一个数组的位置的值index2,计算公式为:
24.index2=size%(arraylen-1),
25.当index2的值不等于1时,将所述栈元素b出栈,size值减1;
26.当index2的值等于1时,将所述栈元素b出栈,释放最后一个数组地址*lastarray指向的数组并将*lastarray指向倒数第二个数组。
27.进一步地,步骤4中的元素入栈后的位置表示为:*item=newarray2[index]。
[0028]
进一步地,所述结构体还包括查询函数findbyrule、排序函数sortbyrule和显示函数showall。
[0029]
进一步地,所述查询函数findbyrule的查询步骤为:
[0030]
步骤a:设定一个条件参数*rule,所述*rule是一个函数指针,所述*rule指向的函数为规则函数rule;
[0031]
步骤b:设定一个currentarray循环数组,并将第一个数组的地址赋值给currentarray,即*currentarray=*firstarray;
[0032]
步骤c:设定一个循环变量i=0,循环开始并判断i是否小于size;
[0033]
若i的值大于或等于size的值时,则返回空值,循环结束;
[0034]
若i的值小于size的值时,则判断当前的元素是否符合所述规则函数rule的规则,若符合,则返回当前元素;
[0035]
若不符合,则判断当前的元素是否是当前数组中的最后一个栈元素;
[0036]
若当前的元素是当前数组的最后一个栈元素,则改变当前循环的数组为下一个数组,循环继续;
[0037]
若当前循环的元素不是当前数组的最后一个栈元素,循环继续;
[0038]
判断当前循环的元素是否是当前数组中的最后一个栈元素的依据是:若i%(arraylen-1)==arraylen-2,则当前循环的元素是当前数组的最后一个栈元素;
[0039]
步骤d:当i的值大于size的值时,则表示没有找到符合规则函数rule的规则的元素,返回空值,循环结束。
[0040]
进一步地,所述排序函数sortbyrule的排序步骤为:
[0041]
步骤a:建立第三数组;
[0042]
步骤b:遍历结构体的所有元素,并根据排序规则将栈元素依次插入到第三数组中;
[0043]
步骤c:遍历结束后,第三数组的排序完成。
[0044]
进一步地,所述第三数组的长度为当前栈的大小。
[0045]
进一步地,所述排序规则包括升序排序和降序排序。
[0046]
进一步地,所述显示函数showall采用for循环语句对所述结构类的所有栈元素进行遍历。
[0047]
本发明的有益效果为:
[0048]
本发明公开的一种栈的自动增长处理方法,利用多个等长数组来存放栈元素。当数组的容量不足时,新建一个等长的数组,在数组的最后一个元素存放新建数组的地址指针,将新入栈的元素存储在新数组中;当数组(除了第一个数组)无存放任何栈元素时,释放该数组,防止空间内存的占用和浪费。该方法实现数组的动态增长效果,即栈的自动增长功能,提升了栈的存储效率,可广泛应用于量子网络与计算机领域。
附图说明
[0049]
图1为本发明一种栈的自动增长处理系统的原理框图;
[0050]
图2为本发明一种栈的自动增长处理方法的步骤流程图;
[0051]
图3为本发明一种栈的自动增长处理方法的入栈流程图;
[0052]
图4为本发明一种栈的自动增长处理方法的出栈流程图。
具体实施方式
[0053]
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例对本发明进行进一步详细说明,但本发明要求保护的范围并不局限于下述具体实施例。
[0054]
如图1所示,一种栈的自动增长处理系统,包括结构类建立模块、数组建立模块、出栈模块和入栈模块,其中:
[0055]
所述结构类建立模块用于建立一个通用栈的结构类,并设置结构类的成员变量;
[0056]
所述数组建立模块用于构建所述结构类的构造函数并新建第一数组;
[0057]
所述入栈模块用于进行入栈操作,采用所述入栈函数push来计算当前栈尾元素在最后一个数组的位置的值index1;当所述index1的值不等于0时,则将所述元素a入栈,
[0058]
当index1的值等于0,则通过数组建立模块建立第二数组;
[0059]
所述出栈模块用于进行出栈操作,采用出栈函数pop来计算当前栈尾元素b在最后一个数组的位置的值index2,当index2的值不等于1时,将所述栈元素b出栈;
[0060]
当index2的值等于1时,将所述栈元素b出栈,释放最后一个数组地址*lastarray指向的数组并将*lastarray指向倒数第二个数组。
[0061]
本系统中各个模块的具体实现方案与以下一种栈的自动增长处理方法的对应部分采用的方法一致,这里不再赘述。
[0062]
如图2-4所示,一种栈的自动增长处理方法,所述方法的具体步骤如下:
[0063]
步骤1:建立一个通用栈的结构类,并设置结构类的成员变量;
[0064]
所述成员变量包括存放栈元素的第一个数组地址指针*firstarray,存放栈元素的最后一个数组地址指针*lastarray,每个数组的长度arraylen,当前数组的个数arraynum,当前栈元素的大小size;
[0065]
其中,*firstarray是一个数组地址指针,指存放所有栈元素的数组,而firstarray数组中,里面的每个元素是一个二级指针,指向的是栈元素的地址,该栈元素的实际类型可以是任意一种类型,整形、字符型、布尔型、指针类型等都可以,根据需求,取其中一种,利用模板template声明类型,栈元素的类型是一致的,即该栈不能既存储整形,又存储布尔型。
[0066]
步骤2:构建所述结构类的构造函数并新建第一数组,第一数组命名为newarray1,将第一数组的地址分别存入到第一个数组地址指针*firstarray和最后一个数组地址指针*lastarray中;即*firstarray与*lastarray指向地址相同,代表当前只有一个数组。
[0067]
其中,步骤2中新建第一数组时,数组长度arraylen为len,初始数组个数arraynum为1,当前栈元素的大小size为0。
[0068]
步骤3:为所述结构类构建一个入栈函数push与出栈函数pop;
[0069]
其中,所述入栈函数push包括一个栈元素参数,所述参数的命名为*item,类型为指针。
[0070]
当有元素入栈时,步骤4如图1所示:当任意元素a入栈时,采用所述入栈函数push来计算当前栈尾元素在最后一个数组的位置的值index1,计算公式为:
[0071]
index1=size%(arraylen-1),
[0072]
当所述index1的值不等于0或者当前栈元素大小size等于0,证明当前最后一个数组lastarray还存在剩余空间可以存放入栈元素,则直接将入栈元素a存放在最后一个数组的第index 1个位置,即[index]=*item,此时栈的大小size的值加1;
[0073]
当index1的值等于0,证明当前最后一个数组没有剩余空间可存放入栈元素,需要新建一个数组,且该元素应该存放在新数组中的首位,则建立第二数组newarray2并跳转到步骤5;
[0074]
步骤5:地址指针*lastarray移除当前指向的数组并指向第二数组地址,数组的个数arraynum的值加1,size值加1,并将所述入栈元素a赋值给第二数组的第一个元素,元素a入栈后的位置表示为:*item=newarray2[index];此时栈的大小size的值加1;
[0075]
当有元素出栈时,步骤6如图1所示,步骤6:当栈尾元素b出栈时,采用出栈函数pop来计算当前栈尾元素b在最后一个数组的位置的值index2,计算公式为:
[0076]
index2=size%(arraylen-1),
[0077]
当index2的值不等于1时,证明无需释放最后一个数组的空间,则将所述栈元素b出栈,改变栈元素的大小size,即-size值减1;
[0078]
当index2的值等于1时,证明该元素在最后一个数组的第一个位置,将所述栈元素b出栈后,还需释放最后一个数组地址*lastarray指向的数组并将*lastarray指向倒数第二个数组;
[0079]
改变栈元素的大小size,即-size值减1;
[0080]
在此方法中,所述结构体还包括查询函数findbyrule、排序函数sortbyrule和显
示函数showall。
[0081]
其中,所述结构类查询函数findbyrule的查询步骤为:
[0082]
步骤a:设定一个条件参数*rule,所述*rule是一个函数指针,所述*rule指向的函数为规则函数rule;
[0083]
步骤b:设定一个currentarray循环数组,并将第一个数组的地址赋值给currentarray,即*currentarray=*firstarray;
[0084]
步骤c:设定一个循环变量i=0,循环开始并判断i是否小于size;
[0085]
若i的值大于或等于size的值时,则返回空值,循环结束;
[0086]
若i的值小于size的值时,则判断当前的元素是否符合所述规则函数rule的规则,若符合,则返回当前元素;
[0087]
若不符合,则判断当前的元素是否是当前数组中的最后一个栈元素;
[0088]
若当前的元素是当前数组的最后一个栈元素,则改变当前循环的数组为下一个数组,循环继续;
[0089]
若当前循环的元素不是当前数组的最后一个栈元素,循环继续;
[0090]
判断当前循环的元素是否是当前数组中的最后一个栈元素的依据是:若i%(arraylen-1)==arraylen-2,则当前循环的元素是当前数组的最后一个栈元素;
[0091]
步骤d:当i的值大于size的值时,则表示没有找到符合规则函数rule的规则的元素,返回空值,循环结束。
[0092]
当前循环的数组为下一个数组,循环继续;
[0093]
若当前循环的元素不是当前数组的最后一个栈元素,循环继续;
[0094]
判断当前循环的元素是否是当前数组中的最后一个栈元素的依据是:若i%(arraylen-1)==arraylen-2,则当前循环的元素是当前数组的最后一个栈元素。
[0095]
步骤d:当i的值小于size的值时,则返回空值,循环结束;
[0096]
其中,所述排序函数sortbyrule的排序步骤为:
[0097]
步骤a:建立第三数组;第三数组的长度为当前栈的大小
[0098]
步骤b:遍历结构体的所有元素,并根据排序规则将栈元素依次插入到第三数组中;其中,所述排序规则包括升序排序和降序排序。
[0099]
步骤c:遍历结束后,第三数组的排序完成。
[0100]
其中,所述结构体的显示函数showall是对栈元素进行查找和遍历,因为栈结构中存在多个数组,需要循环遍历每个数组的有效元素,则函数showall采用for循环语句对所述结构类的所有栈元素进行遍历。
[0101]
本发明的方法利用的是数组的建立和销毁来实现栈的自动增长,因此不需要为每个栈元素分配额外的指针空间,不会产生过多结构性的开销。在自动增长方面,不需要跟现有技术扩容/缩容方法一样,新建一个数组,并把原来数组挨个复制到新数组里面,不需要经过o(n)时间,时间复杂度从o(n)变成o(1);同时,原来数组依然存在利用,不需要频繁销毁,因此,不管是空间、还是时间,效果都有显著的提升,可广泛应用于量子网络与计算机领域。
[0102]
根据上述说明书的揭示和教导,本发明所属领域的技术人员还可以对上述实施方式进行变更和修改。因此,本发明并不局限于上面揭示和描述的具体实施方式,对发明的一
些修改和变更也应当落入本发明的权利要求的保护范围内。此外,尽管本说明书中使用了一些特定的术语,但这些术语只是为了方便说明,并不对发明构成任何限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献