Python算法训练 表达式计算

254 阅读2分钟

试题 算法训练 表达式计算

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题主做这道题目的时候,查了各种各样的别的语言的做法,大多都是转后缀表达式,没有真正的从python的角度实现。
题主本次使用的方法没有外部引入库,两行搞定,也是再一次真真切切的体会了一把我大python的博大精深。
为了更好的理解,可以参考后文加入的C++版本的代码,也是不错的学习。

问题描述

输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入输出

  • 输入格式   输入一行,包含一个表达式。
  • 输出格式   输出这个表达式的值。
  • 样例输入    1-2+3*(4-5)
  • 样例输出    -4
  • 数据规模和约定   表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

Python版本 代码如下

s = input()
print(eval(s))

C++版本 代码如下

对比一下C++语言的代码,相对麻烦些。

#include <cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
 
 
const int maxn=10010;
char str[maxn];
char s[maxn];
int val[maxn];
 
stack<int> s;
stack<char> fu;

/*逆波兰表达式*/
int solve(int num1,int num2,char ch){
    if(ch=='-') return num1-num2;
    if(ch=='+') return num1+num2;
    if(ch=='*') return num1*num2;
    if(ch=='/') return num1/num2;
    printf("****\n");
    return -1;
}
 
int cmp(char c1,char c2){
    if(c1=='('||c2=='(') return 0;
    if(c1=='+'||c1=='-') return 1;
    if(c1=='*'&&(c2=='*'||c2=='/')) return 1;
    if(c1=='/'&&(c2=='*'||c2=='/')) return 1;
    return 0;
}

int main()
{
    memset(s, 0, sizeof(s));
    scanf("%s", str);
    int len = strlen(str);
    str[len] = ')';
    int cur = 0;
    fu.push('(');
    for(int i=0;i<=len;){
        if(str[i]>='0'&&str[i]<='9'){
            int sum=0;
            while(i < len && str[i] >= '0' && str[i] <= '9'){
                sum = sum * 10 + str[i] - '0';
                i++;
            }
            val[cur++] = sum;
        }
        else{
            if(str[i]==')'){
                while(!fu.empty() && fu.top() != '('){
                    s[cur++]=fu.top();
                    fu.pop();
                }
                fu.pop();
            }
            else{
                while(!fu.empty() && cmp(str[i],fu.top())){
                    s[cur++]=fu.top();
                    fu.pop();
 
                }
                fu.push(str[i]);
            }
            i++;
        }
    }

    for(int i=0;i<cur;i++){
        if(!s[i])
            s.push(val[i]);
        else{
            int v2=s.top();
            s.pop();
            int v1=s.top();
            s.pop();
            int v=solve(v1,v2,s[i]);
            s.push(v);
        }
    }
    printf("%d\n", s.top());
    return 0;
}