精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-10
/*********************************************************************************************************************** 二、计算后缀表达式的思路是: 三、直接计算中缀表达式思路: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-12
我去年在上编译原理的时候,写过逆波兰式的源码。
可以计算结果的。 以下是源码,用的思想是运算符的优先级。 我设置的结果为整形,需要的可以修改result类型。 说明一下, 1.stack是运算符堆栈, 2.'(',')'处理的过程 遇到'(','('的优先级高于所有运算符, 遇到')',不入stack,而是出堆栈stack,进行计算。 #include<iostream> using namespace std; char simple[6]={')','+','-','/','*','('}; int stack[100]; int top=-1; int main() { char s[100]; char t[100]; cin>>s; int result[100]; int ReTop=-1; int i=0,j,k=0; int tag=1; cout<<"\t计算过程"<<endl; while(s[i]!='\0') { j=0; while(simple[j]!=s[i])j++; if(j>=6) { t[k]=s[i];k++; if(tag==0) { result[ReTop]*=10; result[ReTop]+=s[i]-'0'; } else { result[++ReTop]=s[i]-'0'; } tag=0; } else { t[k++]=' '; tag=1; if(top==-1) { top++; if(j==5){stack[top]=0;} else stack[top]=j; } else { if(stack[top]<j) { top++; if(j==5)stack[top]=0; else stack[top]=j; } else { while(top!=-1&&stack[top]>=j) { if(j==0&&stack[top]==0){break;} else { t[k]=simple[stack[top]]; t[++k]=' '; k++; if(stack[top]==1){result[ReTop-1]+=result[ReTop];cout<<"\t{+}:="<<result[ReTop-1]<<endl;} else if(stack[top]==2){result[ReTop-1]-=result[ReTop];cout<<"\t{-}:="<<result[ReTop-1]<<endl;} else if(stack[top]==3){result[ReTop-1]/=result[ReTop];cout<<"\t{/}:="<<result[ReTop-1]<<endl;} else if(stack[top]==4){result[ReTop-1]*=result[ReTop];cout<<"\t{*}:="<<result[ReTop-1]<<endl;} ReTop--; } top--; } if(j!=0) {top++; stack[top]=j;} else top--; } } } i++; } while(top!=-1) { t[k]=simple[stack[top]]; t[++k]=' '; k++; if(stack[top]==1){result[ReTop-1]+=result[ReTop];cout<<"\t{+}:="<<result[ReTop-1]<<endl;} else if(stack[top]==2){result[ReTop-1]-=result[ReTop];cout<<"\t{-}:="<<result[ReTop-1]<<endl;} else if(stack[top]==3){result[ReTop-1]/=result[ReTop];cout<<"\t{/}:="<<result[ReTop-1]<<endl;} else if(stack[top]==4){result[ReTop-1]*=result[ReTop];cout<<"\t{*}:="<<result[ReTop-1]<<endl;} ReTop--; top--; } t[k]='\0'; cout<<"逆波兰式:"<<t<<endl; cout<<"结果:"<<result[ReTop]<<" "<<endl; system("pause"); } |
|
返回顶楼 | |
发表时间:2011-05-12
运行完毕,结果正确 |
|
返回顶楼 | |
发表时间:2011-05-14
忘记了,如果需要计算浮点数,需要对程序修改,不仅仅是result类型。
|
|
返回顶楼 | |
浏览 5512 次