实验三 逆波兰表达式的产生及计算.docx
- 文档编号:7330531
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:29
- 大小:246.36KB
实验三 逆波兰表达式的产生及计算.docx
《实验三 逆波兰表达式的产生及计算.docx》由会员分享,可在线阅读,更多相关《实验三 逆波兰表达式的产生及计算.docx(29页珍藏版)》请在冰豆网上搜索。
实验三逆波兰表达式的产生及计算
实验三逆波兰表达式的产生及计算
一、实验目的
非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。
二、实验内容
将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。
三、逆波兰表达式的产生及计算实验设计思想及算法
◆逆波兰式定义
将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表达式也称做后缀式。
逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。
◆产生逆波兰式的前提
中缀算术表达式
◆逆波兰式生成的设计思想及算法
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:
将该字符与运算符栈顶的运算符的优先关系相比较。
如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。
倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。
(5)重复上述操作
(1)-
(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
运用以上算法分析表达式(a+b*c)*d的过程如下:
当前符号
输入区
符号栈
输出区
(
a+b*c)*d
a
+b*c)*d
(
+
*c)*d
(
a
b
c)*d
(+
a
*
)*d
(+
ab
c
*d
(+*
ab
)
*d
(+*
abc
)
*d
(+
abc*
)
d
(
abc*
*
abc*+
d
*
abc*+
*
abc*+d
abc*+d
(1)构造一个栈,存放运算对象。
(2)读入一个用逆波兰式表示的简单算术表达式。
(3)自左至右扫描该简单算术表达式并判断该字符,如果该字符是运算对象,则将该字符入栈。
若是运算符,如果此运算符是二目运算符,则将对栈顶部的两个运算对象进行该运算,将运算结果入栈,并且将执行该运算的两个运算对象从栈顶弹出。
如果该字符是一目运算符,则对栈顶部的元素实施该运算,将该栈顶部的元素弹出,将运算结果入栈。
(4)重复上述操作直至扫描完整个简单算术表达式的逆波兰式,确定所有字符都得到正确处理,我们便可以求出该简单算术表达式的值。
◆逆波兰式计算的设计思想及算法
四、实验要求
1、编程时注意编程风格:
空行的使用、注释的使用、缩进的使用等。
2、如果遇到错误的表达式,应输出错误提示信息。
3、程序输入/输出实例:
◆输入以#结束的中缀表达式(包括+-*/()数字#)。
例:
(1)(a+b)
(2)(a+b*c)(3)B+(-(A))*C
输出逆波兰表达式的格式如下:
(1)(a+b);→ab+)(
(2)(a+b*c)→abc*+)(
(3)B+(-A(A))*C→BA)(-)(C*+
◆输入中缀表达式并计算结果:
a*(b+c)+(-d)#;
输出逆波兰式:
abc+*d@+
输入:
a=3;b=1;c=2;d=5;
计算结果为:
4
五、实验步骤
1、根据流程图编写出各个模块的源程序代码上机调试。
2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的逆波兰式的产生及计算程序;直至能够得到完全满意的结果。
3、书写实验报告;实验报告正文的内容:
◆描述逆波兰式的产生及计算程序的设计思想。
◆程序结构描述:
函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。
◆详细的算法描述(程序执行流程图)。
◆给出软件的测试方法和测试结果。
◆实验总结(设计的特点、不足、收获与体会)。
六、源代码
1、操作类
packageRPNAnalysis;
publicclassRPN_Operation{
privatechar[]expChar=newchar[100];//表达式栈
privateintexpPointer=0;//表达式栈指针
privatechar[]ariStack=newchar[100];//运算符栈
privateinttop=0;//运算符栈指针
privatechar[]exitChar=newchar[100];//输出栈
privateintexitPointer=0;//输出栈指针
privateString[][]dataStrings=newString[1000][5];//表格数据
privateStringtempString=newString();//临时字符串
privateStringresult=newString();//结果字符串
privateintrow=0;//表格数据行
privateStringcompValue=newString();//计算值
privatefinalchar[]Arithmetic={'+','-','*','/','(',')','#'};//运算符
privatefinalchar[]Letter={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'
'q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L'
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//字母表
privatefinalchar[]Digit={'1','2','3','4','5','6','7','8','9','0'};//数字表
publicRPN_Operation(){
for(inti=0;i<1000;i++){
for(intj=0;j<5;j++){
dataStrings[i][j]=newString();
dataStrings[i][j]="";
}
}
}
//判断字符是否为字母
publicbooleanisLetter(charword){
intN=0;
while(N if(word==Letter[N]){ returntrue; } N++; } returnfalse; } //判断字符是否为数字 publicbooleanisDigit(charword){ intN=0; while(N if(word==Digit[N]){ returntrue; } N++; } returnfalse; } //判断字符是否为算数运算符 publicbooleanisArithmetic(charword){ intN=0; while(N if(word==Arithmetic[N]){ returntrue; } N++; } returnfalse; } //输出剩余字符串 publicvoidprintExpChar(){ tempString=newString(); for(inti=expPointer;i tempString+=expChar[i]; System.out.print(expChar[i]); result+=expChar[i]; } System.out.print("\t\t"); result+="\t\t"; } //输出符号栈 publicvoidprintAriStack(){ tempString=newString(); for(inti=0;i tempString+=ariStack[i]; System.out.print(ariStack[i]); result+=ariStack[i]; } System.out.print("\t\t"); result+="\t\t"; } //输出逆波兰式 publicvoidprintExitChar(){ tempString=newString(); for(inti=0;i tempString+=exitChar[i]; System.out.print(exitChar[i]); result+=exitChar[i]; } System.out.print("\r\n"); result+="\r\n"; } //检查字符 publicbooleancheckString(StringcheckString){ charch; for(inti=0;i ch=checkString.charAt(i); if(isLetter(ch)){ continue; }elseif(isDigit(ch)){ continue; }elseif(isArithmetic(ch)){ continue; }else{ returnfalse; } } returntrue; } //逆波兰分析 publicvoidRPNAnalysis(Stringexpression){ expChar=expression.toCharArray(); charch=expChar[expPointer++]; inttemp=0; if(checkString(expression)){ System.out.print("步骤\t当前符号\t输入区\t\t运算符号栈\t\t输出区\r\n"); result+="步骤\t当前符号\t输入区\t\t运算符号栈\t\t输出区\r\n"; while(ch! ='#'){ if(isArithmetic(ch)){ switch(ch){ case'(': ariStack[top++]=ch; System.out.print(row+"\t"+ch+"\t"); result+=row+"\t"+ch+"\t"; dataStrings[row][0]=row+""; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; break; case')': while(ariStack[--top]! ='('){ exitChar[exitPointer++]=ariStack[top]; System.out.print(row+"\t"+ch+"\t"); result+=row+"\t"+ch+"\t"; dataStrings[row][0]=row+""; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; } System.out.print(row+"\t"+ch+"\t"); dataStrings[row][0]=row+""; result+=row+"\t"+ch+"\t"; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; break; case'+': case'-': temp=top-1; if(temp>=0&&(ariStack[temp]=='*'||ariStack[temp]=='/')){ exitChar[exitPointer++]=ariStack[temp]; top--; }elseif(temp>=0&&(ariStack[temp]=='-'||ariStack[temp]=='+') &&(expChar[expPointer+1]! ='*'||expChar[expPointer+1]! ='/')){ exitChar[exitPointer++]=ariStack[temp]; top--; } while(top<0&&ariStack[temp]! ='('){ exitChar[exitPointer++]=ariStack[temp]; top--; } ariStack[top++]=ch; System.out.print(row+"\t"+ch+"\t"); result+=row+"\t"+ch+"\t"; dataStrings[row][0]=row+""; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; break; case'*': case'/': temp=top-1; if(temp>=0&&(ariStack[temp]=='*'||ariStack[temp]=='/')){ exitChar[exitPointer++]=ariStack[temp]; top--; } ariStack[top++]=ch; System.out.print(row+"\t"+ch+"\t"); result+=row+"\t"+ch+"\t"; dataStrings[row][0]=row+""; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; break; default: break; } }elseif(isLetter(ch)||isDigit(ch)){ exitChar[exitPointer++]=ch; System.out.print(row+"\t"+ch+"\t"); result+=row+"\t"+ch+"\t"; dataStrings[row][0]=row+""; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; } ch=expChar[expPointer++]; } while(top! =0){ temp=top-1; if(ariStack[temp]=='('){ top--; continue; } exitChar[exitPointer++]=ariStack[--top]; System.out.print(row+"\t"+ch+"\t"); result+=row+"\t"+ch+"\t"; dataStrings[row][0]=row+""; dataStrings[row][1]=String.valueOf(ch); printExpChar(); dataStrings[row][2]=tempString; printAriStack(); dataStrings[row][3]=tempString; printExitChar(); dataStrings[row][4]=tempString; row++; } } } //计算值 publicvoidcompValue(){ intstack[]=newint[100]; exitChar[exitPointer++]='#'; charch; inti=0,top=0; ch=exitChar[i++]; while(ch! ='#'){ switch(ch){ case'+': compValue+=stack[top-1]+"+"+stack[top]; stack[top-1]=stack[top-1]+stack[top]; compValue+=": ="+stack[top-1]+"\r\n"; top--; break; case'-': compValue+=stack[top-1]+"-"+stack[top]; stack[top-1]=stack[top-1]-stack[top]; compValue+=": ="+stack[top-1]+"\r\n"; top--; break; case'*': compValue+=stack[top-1]+"*"+stack[top]; stack[top-1]=stack[top-1]*stack[top]; compValue+=": ="+stack[top-1]+"\r\n"; top--; break; case'/': compValue+=stack[top-1]+"/"+stack[top]; stack[top-1]=stack[top-1]/stack[top]; compValue+=": ="+stack[top-1]+"\r\n"; top--; break; default: top++; stack[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 逆波兰表达式的产生及计算 实验 波兰 表达式 产生 计算