数据结构实验—栈及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法与数据结构》课程实验报告
一、实验目的
1.熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈
的基本操作在栈的顺序存储结构。
2.实现栈的顺序存储结构,通过实验深入理解栈的操作特点。
二、实验内容及要求
1.实现栈的存储结构及相关操作:进栈、出栈、取栈顶元素等。
2.使用该栈完成对一个字符串的逆序输出。
3.使用该栈完成判断表达式的括号是否匹配。
4.对算术表达式求值。
三、系统分析
(1)数据方面:该栈数据元素类型采用浮点型,在此基础上进行栈的基本操作,并可将栈中数据使用文本文档保存。在栈的应用中,采用的是存储字符元素类型的栈,并进行对字符的相关操作。
(2)功能方面:能实现栈的一些基本操作,主要包括:
1.进栈操作:若栈不满,则将元素x插入至栈的栈顶,若栈满则进行溢出
处理。
2.出栈操作:若栈不空,则函数返回该栈栈顶的元素,并且栈顶指针退1。
3.获取栈顶元素:若栈不空,则函数返回栈顶元素。
4.判断栈是否为空、判断栈是否满。
5.计算栈中元素个数:直接返回栈中元素个数。
6.清空栈内容:将栈顶指针赋为初始值。
7.保存数据:将栈中元素数据保存至文本文档中。
四、系统设计
(1)设计的主要思路
顺序栈可以采用顺序表作为其存储表示,为此,在顺序栈的声明中用顺序表定义它的存储空间。存放栈元素的数组的头指针为*elements,该数组最大能允许存放元素个数为maxSize,当前栈顶位置由数组下标指针top知识。并规定如果栈不空时,elements[0]为栈中第一个元素。由于实验中还需完成栈的相关应用,故使用两个菜单分别完成栈的基本操作与栈的应用调试。
(2)数据结构的设计
顺序栈定义为只允许在表的末端进行插入和删除的线性表。允许插入和删除的一端叫做栈顶,而不允许插入和删除的另一端叫做栈底。当栈中没有任何元素时则成为空战。即栈又被称为后进先出的线性表,故与线性表的相关操作类似,
在此基础上完成栈的相关操作及应用。
数据结构设计思路
(3)基本操作的设计
栈的基本操作主要包括进栈、出栈、弹出栈顶元素等。主要难点是在栈相关应用的实现。第一个应用即是通过栈的操作实现括号匹配。思路则是依次扫描输入字符串,将左括号存放至栈中,后续扫描遇到右括号则与之相匹配,同时在栈顶删除左括号。最后将括号匹配信息输出。在实现栈进行表达式计算过程稍微复杂。先编写一个Calculator类,该类实现表达式计算的进操作数、退操作数等操作,在主函数文件中编写将中缀表达式转为后缀表达式函数,将转化后的表达式在进行计算即可。算法主要思路为:顺序扫描表达式每一项,如果是操作数则进行压栈,为操作符则弹出两个操作数,并进行指令运算,将结果再次压入栈中,处理完后,将结果输出即可。由于为了实现多为操作数的计算故需作出相应改进,用一个字符串保存输入的表达式,在通过字符串操作将操作数和操作符保存至一个字符串数组中,再通过栈的操作将其转为后缀表达式并存放至字符串数组中,在在字符串数组的基础上进行表达式值得计算。该函数可计算操作数为双精度的表达式。
五、编程环境与实验步骤
(1)编程环境
操作系统:Windows操作系统;编程工具软件:Visual Studio 2017
(2)实验步骤
程序相关文件为SeqStack模板类文件、Calculator类文件、以及主函数调试文件main.cpp。Calculator类文件在栈应用操作中实现表达式相关计算,SeqStack 模板类文件包括栈的相关操作,例如进栈、出栈等操作。主函数调试文件则是用于调试栈的基本操作,并且添加了相关栈应用的相关函数,可通过两个菜单的关联,完成栈的基本操作以及相关应用的实现。
(3)编译参数
无编译参数,在Vs2017或其他版本中新建项目然后将三个文件main.cpp、Calculator.h、SeqStack.h添加到解决方案中的头文件中调试即可。
六、实现代码
#include
#include"Calculator.h"
#include
using namespace std;
const int maxLength = 100; //最大匹配字符串长度
int isp(char &a);//栈内优先数
int icp(char &a);//栈外优先数
void PrintMatchedPairs(char *expression);//栈的应用——括号匹配
void postfix();//栈的应用——中缀表达式转化为后缀表达式
void inverse(char *c);//栈的应用——字符串逆序输出
void menu1();//栈的基本操作菜单
void menu2();//栈的应用菜单
string str2[1000];//用于存放中缀表达式
int number = 0;//用于表示表达式中数据个数
int main() {
int fini = 0; int choose;
while (!fini) {
cout <<"***************************************"<< endl;
cout <<"-----------1、栈的基本操作-------------"<< endl;
cout <<"-----------2、栈的应用-----------------"<< endl;
cout <<"-----------3、退出---------------------"<< endl;
cout <<"***************************************"<< endl;
cout <<"请输入你的选择[1-3]:"<< endl;
cin >> choose;
switch (choose) {
case 1:
menu1();
break;
case 2:
menu2();
break;
case 3:
fini = 1;
break;
default:
cout <<"输入选择错误,请重新输入!"<< endl;
}
}
return 0;
}
int isp(char &a) {
switch (a) {
case'#':
return 0; break;
case'(':
return 1; break;