数据结构实验—栈及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档