编译原理 中缀表达式转换成后缀表达式,并按后缀表达式计算

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

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;

}

[教师评语]

相关文档
最新文档