四川大学《数据结构与算法分析》课程设计报告-带括号的算术表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四川大学《数据结构与算法分析》课程设计报告-带括号的算术表达式

《数据结构与算法分析》课程设计报告

课题名称:带括号的算数表达式求值

课题设计人(学号):

指导教师:朱宏

评阅成绩:

评阅意见:

提交报告时间:2014 年12月9日

带括号的算数表达式求值

计算机类专业

学生指导老师朱宏

[摘要] 在平时的生活中,我们可以解决一些简单的算术表达式,如果当我们遇到一些式子较为冗长,运算比较复杂的算术表达式时,我们都会选择计算器。那么,计算器又是通过怎样的原理来进行运算的呢。

本程序利用堆栈先进后出的特点,采用操作数和操作符两个堆栈,实现由中缀表达式到后缀表达式的转换并求值的过程。带括号的算术表达式的求值是堆栈的一个典型的应用实例。

关键词:计算器堆栈C++

-1-

一、实验名称:带括号的算术表达式求值

二、实验的目的和要求:

1.采用算符优先数算法,能正确求值表达式;

2.熟练掌握栈的应用;

3.熟练掌握计算机系统的基本操作方法,了解如何编辑、编译、链接和运行一个C++程序;

4.上机调试程序,掌握查错、排错使程序能正确运行。

三、实验的环境:

硬件环境:

处理器:Inter(R) Core(TM) i7-4500U

内存:8.00GB

软件环境:

操作系统:Windows8.1

编译软件:Microsoft Visual Studio 2012

四、算法描述:

我设计的带有括号的算术表达式求值的程序中,运算符的优先级是这样子的:

1.先乘除,后加减

2.同级运算从左到右依次运算。

3.先括号内的运算,再括号外的运算。

我的设计思路是,先输入一个最后不带等于号的中缀表达式,先对表达式检查是否有错误,如果有将会输出“表达式有错误”,否则通

-2-

过堆栈方法将这个中缀表达式转化为后缀表达式,然后将后缀表达式求值。

transform()——用于将中缀表达式转换为后缀表达式calculate()——将后缀表达式进行求值

examine()——检查输入的表达式是否有错误

main()——主程序。

五:源程序清单:

#include

#include

#include

#include

using namespace std;

string transform(string str)//转换为后缀表达式{

stack ope;

int i;

string exp="";

for(i=0;i

{

if(str[i]=='.'||isdigit(str[i]))

{

-4-

exp+=str[i];

}

else if(str[i]=='+'||str[i]=='-')

{

int j=i-1;

if(isdigit(str[j]))

{

exp+=" ";//每个数字的后面都加一个空格加以区分if(ope.empty()||ope.top()=='(')

{

ope.push(str[i]);

}

else

{

while(!ope.empty()&&ope.top()!='(')

{

exp+=ope.top();

ope.pop();

}

ope.push(str[i]);

-5-

}

else

{

if(ope.empty()||ope.top()=='(') {

ope.push(str[i]);

}

else

{

while(!ope.empty()&&ope.top()!='(')

{

exp+=ope.top();

ope.pop();

}

ope.push(str[i]);

}

}

}

else if(str[i]=='*'||str[i]=='/'||str[i]=='%')

-6-

int j=i-1;

if(isdigit(str[j]))

{

exp+=" ";

if(ope.empty()||ope.top()=='('||ope.top()=='+'||ope.top( )=='-')

{

ope.push(str[i]);

}

else

{

while(!ope.empty()&&ope.top()!='('&&ope.top()!='+'&&ope.top ()!='-')

{

exp+=ope.top();

ope.pop();

}

-7-

ope.push(str[i]);

}

}

else

{

if(ope.empty()||ope.top()=='('||ope.top()=='+'||ope.top( )=='-')

{

ope.push(str[i]);

}

else

{

while(!ope.empty()&&ope.top()!='('&&ope.top()!='+'&&ope. top()!='-')

{

exp+=ope.top();

ope.pop();

}

-8-

相关文档
最新文档