zoukankan      html  css  js  c++  java
  • 表达式的计算

    引用某本蓝书

    解决这道题,首先其实就是两步,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;
    }
  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/coder-cjh/p/11370347.html
Copyright © 2011-2022 走看看