试题 算法训练 表达式计算
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题主做这道题目的时候,查了各种各样的别的语言的做法,大多都是转后缀表达式,没有真正的从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;
}