表达式的计算

时间:2019-08-17
本文章向大家介绍表达式的计算,主要包括表达式的计算使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

引用某本蓝书

解决这道题,首先其实就是两步,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