编译原理 中缀表达式转换成后缀表达式,并按后缀表达式计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三中缀表达式转换成后缀表达式,并按后缀表达式计算[实验目的]
对中缀表达式转换成后缀表达式,然后按后缀表达式计算进行分析与设计,并上机运行。使学生能通该实验理解对一个简单表达式的编译实现过程。
[实验要求]
要求对中缀表达式转换成后缀表达式,然后按后缀表达式计算作设计性实验,并上机运行,写出实验报告。
[实验时数]
2学时。
[实验内容]
中缀表达式转换成后缀表达式,然后按后缀表达式计算,例如:A*(B+C)/D-E*(F+G)。[实验环境]
硬件坏境:实验室209、一人一台机子。
软件坏境:Windows XP、Visual studio 6.0
[算法描述及实验步骤]
根据本实验内容的要求,实验要实现的是一个中缀表达式转换成后缀表达式并输出。通过设计一个算法来实现以上实验。
[调试过程]
运行Visual studio 6.0。打开事先编写的程序:中缀到后缀.cpp。在Visual studio 6.0环境下进编译、调试、运行。多次重复无错误后,输出结果。
[实验结果]
[实验总结]
[附录]
#include
#include
using namespace std;
bool prior(char op1,char op2) {
bool ret=false;
switch (op1)
{
case'+':
case'-':
switch(op2)
{
case'+':
case'-':
case'*':
case'/':
ret= false;break;
case'#':
case'(':
ret = true;break;
}
break;
case'*':
case'/':
switch(op2)
{
case'#':
case'+':
case'-':
case'(':
ret= true;break;
case'*':
case'/':
ret= false;break;
}
break;
}
return ret;
}
int main(int argc, char* argv[])
{
char s[]="A*(B+C)/D-E*(F+G)";
int k;
for(k=0;k<17;k++)
{
cout<
}
cout< stack int i=0; operS.push('#'); while(s[i]!='\0') { if(s[i]==' ') { i++; continue; } if(s[i]>='A' && s[i]<'Z' ) //是º?字Á?母? { cout< } else//不?是º?字Á?母? { switch(s[i]) { case'+': case'-': case'*': case'/': if(prior(s[i],operS.top()))//比À¨¨栈?顶£¤优®?先¨¨级?高?,直¡À接¨®进?栈? { operS.push(s[i]); } else if(operS.top()!='(') //比À¨¨栈?顶£¤优®?先¨¨级?低̨ª,ê?先¨¨出?栈?,s[i]进?栈? { cout< operS.pop(); operS.push(s[i]); } break; case'(': //直¡À接¨®进?栈? operS.push(s[i]); break; case')': //匹£¤配?栈?内¨²的Ì?'(',都?出?栈?,ê?并¡é删¦?除y'(' while(operS.top()!='(') { cout< operS.pop(); } operS.pop(); break; case'#': break; } } i++; } while(!operS.empty()) { cout< operS.pop(); } cout< int a; cin >> a; return 0; } [教师评语]