首页 > 其他 > 详细

表达式的计算

时间:2019-08-17 22:14:21      阅读:81      评论:0      收藏:0      [点我收藏+]

引用某本蓝书

解决这道题,首先其实就是两步,1.把中缀转后缀 2.把后缀计算并输出

1. 中缀表达式转后缀表达式

      建立一个栈来存储运算符

  • 左括号:进栈
  • 数字:输出
  • 右括号:取栈顶直到左括号,把左括号出栈
  • 运算符:保证优先级的前提下,插入到合适的地方

2.计算后缀表达式

      建立一个栈存数

  •      遇到数:进栈
  •      遇到运算符:取栈顶两个数进行计算

大概就是这样了,代码如下:

#include<bits/stdc++.h>
using namespace std;
inline int bj(char op){//^ > */ > +- > ( 
    if(op==()return 0;
    if(op==+||op==-)return 1;
    if(op==*||op==/)return 2;
    if(op==^)return 3;
    return -1; 防止特殊情况
}
inline int calc(char op,int a,int b){//运算
    switch(op){//注意先后顺序
        case +:return a+b;
        case -:return a-b;
        case *:return a*b;
        case /:return a/b;
        case ^:return pow(a,b);
    }
}
string st1;
inline string change(string s){//转成后缀表达式
    int top=0;
    string res="";//string会更方便
    for(int i=0;i<s.size();i++){
        if(isdigit(s[i]))
         res+=s[i];
        else 
         if(s[i]==()st1[++top]=s[i];//左括号
        else 
         if(s[i]==)){//右括号
          while(top>0&&st1[top]!=()
           res+=st1[top--];
          top--;
         }
         else
          {
          while(top>0&&bj(st1[top])>=bj(s[i]))
           res+=st1[top--];
          st1[++top]=s[i];
          } 
    }
    while(top)res+=st1[top--];
    return res;
}
int st[105],top;
inline void get_ans(string s){
    for(int i=0;i<s.size();i++)
     cout<<s[i]<<" ";
    cout<<endl;
    for(int i=0;i<s.size();i++){
        if(isdigit(s[i]))
         st[++top]=s[i]-0;
        else{
            int a=st[top--],b=st[top--];
            st[++top]=calc(s[i],b,a);
            for(int j=1;j<=top;j++)//先输出处理过的
             printf("%d ",st[j]);
            for(int j=i+1;j<s.size();j++)//输出未处理的
             printf("%c ",s[j]);
            puts("");
         }
        
    }
}
int main(){
    string s;
    cin>>s;
    s=change(s);
    get_ans(s);
    return 0;
}

 

表达式的计算

原文:https://www.cnblogs.com/coder-cjh/p/11370347.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!