堆栈应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1引言
本课程主要是对栈的一些基本操作以及栈的应用进行设计的,栈是操作受限的线性表,先进后出,可称为限定性的数据结构]1[。栈的基本操作包括栈的初始化,进栈操作、出栈操作、取栈顶元素、判读栈是否为空、判断栈是否满以及对栈的置空,通过这些基本操作的组合来实现进制转换、括号匹配、文本输入。
2问题分析
2.1进制转换
将一个十进制的数转换为另一进制,基于数的组成原理位权与进制,转换时让十进制数除以该进制,得到的便是最低位上的数,用得到的商再除以该进制则得到次低位上的数,依次循环下去直到得到的商为0;进制转换完毕,可以看出我们得到首先的是最低位,而数据的书写形式是从高位到低位,所以选择栈的存储结构先进后出,得到的余数顺序进栈,等到结束再顺序出栈输出,这时就是我们先要的结果。
2.2括号匹配
括号匹配是对于一组括号的判断,当输入一个左括号时,它就会等待与之相应的右括号出现,如果等来的却是另一个左括号,那么这时最迫切等待的是刚输入的那个左括号,它会等待与之相应的右括号出现。如果等来了与之相应的右括号,那么它得到了匹配,现在迫切等待的是它之前的左括号,可以看出先进去的左括号迫切需要的程度没后来进去的左括号强,后来者居上,我们选择栈的存储结构,先来的括号进栈,栈顶元素是需要程度最强的,得到了匹配则退栈。
2.3文本输入
文本输入是对于文章来说的,而输入文本时时常会出错,当输入特定的字符时我们会删除该行最后的文字,当错误太多时我们会整行删除,输入特定字符时换行。可以看出这些操作都是在文本的最后执行,所以我们也选择栈存储结构,输入一个字符进栈,输入特定的字符1让栈顶元素出栈,输入特定字符2,则将栈清空。如果栈满,则将文本输出,并且置空,接受下一行的文本,直到输入结束。
由于三种功能用到栈的类型一样,所以我们定义一个类型栈就可以了,栈的定义,如下:
typedef char status;
typedef struct {
status *base;
status *top;
int stacksize;
}sqstack;
3总体设计
3.1总体设计思路:
本程序主要实现三个功能:进制转换、括号匹配、文本输入,基于程序的功能,在主函数中分别调用这三个函数,将这三个函数作为循环结构的循环体,那么可以不断的调用三个函数直到输入特定的数值,当调用完这个函数,又用goto语句,输入特定的数字则继续该函数否则回到目录。由于他们的存储结构相同,数据结构都要用到栈的基本操作,而定义的栈的基本存储单元的基类型一样,所以可由这三个函数分别调用栈的基本操作函数,最后实现程序功能。
3.2系统结构模块图
图 1系统模块结构图
3.3系统流程图
系统流程图:见图2。
4详细设计
4.1进制转换模块
进制转换就是将一个十进制数转换成别的进制。通过输入十进制数和相应的进制,执行函数后,输出对应的进制数。
4.1.1设计思路
基于数的组成原理和位权与进制有关,十进制数与转换成的进制由用户输入,十进制数除以该进制所得余数既是最低位的数,让余数进栈,用所得的商再除以进制得到次最低位数,继续进栈,依次下去,直到商为0。然后将栈中的数字用循环输出。
图 2系统流程图
4.1.2 流程图
流程图见图3。
4.2括号匹配
该功能主要是判断输入的表达式中括号是否匹配,由用户输入一个表达式(判断不出表达式是否合法),执行该函数,若表达式中括号成对匹配则输出合法,不成对,则输出不合法。
图 3 进制转换模块流程图
4.2.1设计思路
首先将表达式存入一个数组中,然后通过指针移动将数组中字符一个个读出,若读到左括号则让字符进栈,若读到右括号则先判断栈是否为空,若栈为空,则改变标致变量,右括号多余,括号组不合法,若栈不空,则取栈顶元素,看两括号是否配对,若配对,则让栈顶元素出栈,若不配对,则不用在读入字符,表达式不合法。依次执行下去,
通过设置标志变量与栈是否为空,最后判断表达式中的括号是否匹配。
图4括号匹配流程图
4.2文本输入
该功能主要是输入一段文字,当输入特定字符时会对文字的末尾文字进行删除操作,当一行呈不下了文本还没结束,则换到下一行,当一行错误太多时可输入特定的字符将这一行清空。
4.2.1设计思路
首先将文本输入一个字符型数字中然后通过指针的移动访问到字符串中的每个字符,规定见到字符#则删除栈顶元素,当见到字符@时则清空当前栈,当遇到%号时则换到下一行。读入第一个字符时判断若是@或#或%则不进行操作,若是其他字符则进栈,进栈后判断栈是否满,如果栈满了则利用递归将栈中的文本输出,如果栈未满且读到的字符为特殊字符则进行相应的退栈或清空操作或换行操作。依次执行下去直到输入的字符串结束。
重点:利用递归将栈中的文本输出。
void shuchu(sqstack &s)//递归将栈满的文本输出
{
char e;
if(s.top==s.base);
else
{
pop(s,e);
shuchu(s);
printf("%c",e);
}
}
4.3.2流程图
流程图见图4。
5运行测试
运行该程序首先在屏幕出现的是总目录,可以选择进行相应的模块,如图5。
5.1进制转换
首先我们运行禁止转换,根据提示我们选择1,则会有提示输入“一个数和相应的进制”,例如我们输入143和16,那么将把143转化成十六进制。如下图。
将143转化为16进制为8F,转换完后,会提示你是否继续进行该函数,如果继续进行进制转换则输入1,返回目录输入0。例如我们输入1,如下图。
基于以上操作,则可继续进行进制转换,例如我们将123转换成8进制,如下图。
5.2括号匹配
继续以上操作,我们输入0回到目录。如下图