• 表达式的计算


    引用某本蓝书

    解决这道题,首先其实就是两步,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;
    }
  • 相关阅读:
    CMake 手册详解(十九)
    CMake 手册详解(二十三)
    CMake 手册详解(二十)
    xtrabackupex xbstream 流备份还原(转载)
    xtrabackup 安装与使用(转载)
    怎么样写好一篇技术博客
    python为什么需要符号表
    cmake的一些基本概念及源码结构
    让IT工作者过劳的13个坏习惯
    SHTML和HTML的区别
  • 原文地址:https://www.cnblogs.com/coder-cjh/p/11370347.html
Copyright © 2020-2023  润新知