实验3-逆波兰式的产生及计算_第1页
实验3-逆波兰式的产生及计算_第2页
实验3-逆波兰式的产生及计算_第3页
实验3-逆波兰式的产生及计算_第4页
实验3-逆波兰式的产生及计算_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上河南工业大学实验报告课程名称 编译原理 _ 实验项目 实验三 逆波兰式的产生及计算院 系_信息科学与工程学院_ 专业班级_ 计科F1201班_ _姓 名_张伟龙_ 学 号_3_ _ 指导老师 阎娟 日 期 2015.5.7 批改日期 成 绩 一. 实验目的1 深入理解算符优先分析法2 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法3 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化二. 实验内容及要求将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。程序输入/输出示例:输出的格式如下:(1)

2、逆波兰式的生成及计算程序,编制人:姓名,学号,班级(2)输入一以#结束的中缀表达式(包括+*/()数字#):在此位置输入符号串如(28+68)*2#(3)逆波兰式为:28&68+2*(4)逆波兰式28&68+2*计算结果为192备注:(1)在生成的逆波兰式中如果两个数相连则用&分隔,如28和68,中间用&分隔;(2)在此位置输入符号串为用户自行输入的符号串。注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、数字,结束符#;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放

3、一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;三. 实验过程#include <iostream>#include <algorithm>#include <string>#include <stack>using namespace std;/*题目:将中缀后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。我们假设输入的中缀表达式都是合法的函数:cal():计算算符优先级compute():计算表达式ace():出栈计算Author: dezhong

4、er*/const double EPS = 1e-6;#define DIVIDEBYZERO "divideByZero"/除零错误#define GOOD "good"string s, ans, FLAG;stack<char> st;/符号栈stack<double> sd;/数字栈int cal(char c) switch(c) case '+': case '-': return 1; case '*': case '/': return 2; def

5、ault: return -; double compute(char c, double a, double b) switch(c) case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if(fabs(b) < EPS) FLAG = DIVIDEBYZERO; return a / b; default: return -; void act() ans += st.top(); double a = sd.

6、top(); sd.pop(); double b = sd.top(); sd.pop(); /cout << st.top() << " " << b << " " << a << endl; double c = compute(st.top(), b, a); sd.push(c); st.pop();int main() freopen("in.txt", "r", stdin); cout << "姓名:张伟龙

7、 学号:3 班级:计科1201" << endl << endl; while(cin >> s) cout << "中缀表达式为: " << s << endl; ans = "" FLAG = GOOD; while(!st.empty() st.pop(); while(!sd.empty() sd.pop(); st.push('#'); int l = s.length(); for(int i = 0; i < l; i+) char c

8、= si; if(isdigit(c) double temp = 0; if(isdigit(ansans.length() - 1) ans += '&' while(isdigit(si) ans += si; temp = temp * 10 + si+ - '0' sd.push(temp); i-; else if(c = '#') ; else if(c = '(') st.push(c); else if(c = ')') while(st.top() != '(') act

9、(); st.pop(); else while( cal(c) <= cal(st.top() act(); st.push(c); while(st.top() != '#')act(); cout << "对应的后缀表达式为: " << ans << endl; if(FLAG = GOOD) cout << "该式子的结果为: " << sd.top() << endl; else cout << "式子中有除0错误" << endl; cout << endl; return 0;四. 实验总结(心得)通过这次的实验,知道了算符优先文法的概念以及这个文法的简单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论