数据结构实验2 四则运算

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

LinkStack OPTR;//存放运算符的栈

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);

相关文档
最新文档