数据结构实验2 四则运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南华大学
实验报告(201 6 ~201 7 学年度第一学期)
数据结构
课程名称
表达式求值
实验名称
姓名XX 学号XX
专业计算机类班级计类九班
地点南华大学教师余童兰
1.实验目的及要求
实验二栈与队列
1.实验目的:
掌握栈的特点及其描述方法,掌握顺序表与链式存储结构实现一个栈或队列,掌握栈与队列中各种等基本操作及典型应用算法。要求自行设计链式栈和链式队列类。
2.实验内容与要求:以下题目任选其一,实验报告格式与实验1一致。
要求自行设计基础类:链式栈或链式队列类(必须是链式存
储)。
1)表达式求值。用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,利用栈完成该表达式的求解;
2)迷宫问题。以一维数组Maze[m+2][n+2]数组描述一个迷宫,元素。
值为0表示通道,值为1表示墙壁,以Maze[1][1]表示迷宫的入口,
而maze[m][n]表示迷宫的出口,外层数据全为1表示外围墙壁,Maze
数组内层数据表达一个迷宫(数据来源于输入或随机赋值),打印一
条如何从Maze[1][1]到达出口Maze[m][n]的路径,若无解,则打印“无
解”信息;
3)舞会模拟。设舞厅能同时容纳m对舞伴共舞,期间播放n支舞曲。
会上男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次
从男队和女队的队头上各出一人配成舞伴,跳完后重新排队。请输入
男队队员个数与名字,女队队员个数与名字,n与舞曲名称,舞厅容
量m,打印各舞曲播放时,跳舞的舞伴配对情况;
2.实验内容
1.1各算法基本思想及各函数流程图
该节描述实验中各类的UML类图及关联;类中各个操作的基本思想,算法流程图及时空复杂度分析;
30分,评分标准:图,表,术,语等规范度15;完整详细度15;)LinkStack类UML图:
Complex_Caculate() 核心函数流程图Caculate函数流程图:
Complex_Caculate()函数思想:对输入的字符进行一个个处理,如果是多位数就调用atof()转换成浮点数。同时对括号进行特殊处理运算。考虑四种情况:当前运算符大于栈顶运算符,左右括号;当前运算符小于栈顶运算符;当前运算符等于栈顶运算符;结束标志#。对着四种情况进行相应的处理。
用链栈作为数据结构,空间复杂度随实践规模大小决定为O(n)。
对输入的表达式字符一个个读取进行处理,时间复杂度为O(n)。
2.2 源程序(要求有20%以上的注释)
(25分;评分标准:注释10;程序风格5;程序功能完整5;容错性及程序效率5;)
//Main.cpp
#include
#include "LinkStack.h"
#include
#include
#include
using namespace std;
//设为全局变量是为了方便Computer的调用
LinkStack
LinkStack
int to=-1,excel[]={0,0,2,1,2,1,0,2},i=0,counter=0;//依次为栈顶运算符优先级,运算符优先级表...
char a[100];//临时存放表达式
double Caculate(double b,double c,char d)
{
switch (d)
{
case '+': /*处理加法*/
return b+c;
case '-': /*处理减法*/
return b-c;
case '*': /*处理乘法*/
return b*c;
case '/': /*处理除法*/
if (0 == c) //除零情况
{
cout<<"Division by zero!\n"< system("pause"); exit(1); } else return b/c; case '^': return pow(b,c); case '%': return (int)b%(int)c; default://存在非法运算符的处理 cout<<"计算停止!有非法字符: "< exit(1); } return 0; } void Computer()//出栈两个运算对象,出栈一个运算符,进行计算。更新顶部运算符优先级 { double b=OPND.Pop();//运算对象1 double c=OPND.Pop();//运算对象2 char d=OPTR.Pop();//运算符 to=excel[a[i]%10];//更新顶部运算符优先级 OPND.Push(Caculate(c,b,d));//运算结果入栈 } void Complex_Caculate()//表达式求值主要函数 { OPTR.Push('#');//初始化终止符 int to2=-1,flag=0,k=1;//遇到括号前的运算符优先级、是否存在括号的标志 char c; while((c=getchar())!='\n')//输入四则运算符表达式 { a[counter++]=c; } a[counter]='#';//尾部终止符 while(1)//遍历处理字符 { if(a[i]=='#')//终止符情况(结束运算) { while(OPTR.GetTop()!='#')//处理两个栈中剩下的对象 { double b=OPND.Pop(); double c=OPND.Pop(); char d=OPTR.Pop(); if(d!='(') OPND.Push(Caculate(c,b,d)); } break; } if(a[i]>='0'&&a[i]<='9')//数字就存入运算对象栈 { int j=i; char b[16]; k=0; while(a[j]>='0'&&a[j]<='9')//处理多位数 { b[k]=a[j]; k++,j++; } b[k]='\0'; OPND.Push(atof(b));//ATOF转换为浮点数 }else if(a[i]>65&&a[i]!='^'&&a[i]!='%') { cout<<"有非法字符!"< exit(1);