#include<bits/stdc++.h>
#define ll long long
#define N 500
using namespace std;
ll n,num[N],cnt,st;
char a[N],s[N];
ll pan(char s){
return (s>='0'&&s<='9');
}
ll yxj(char a,ll b){
if(a=='+'||a=='-') return 1;
if(a=='*'||a=='/') return 2;
if(a=='^') return 3;
if(a=='('&&b==1) return 0;
if(a=='('&&b==0) return 4;
return 0;
}
ll qpow(ll x,ll y){
ll ans=1;
while(y){
if(y&1) ans=ans*x;
x=x*x;
y>>=1;
}
return ans;
}
void suan(){
ll t2=num[cnt],t1=num[cnt-1];
cnt--;
if(s[st]=='+') num[cnt]=t1+t2;
if(s[st]=='-') num[cnt]=t1-t2;
if(s[st]=='*') num[cnt]=t1*t2;
if(s[st]=='/') num[cnt]=t1/t2;
if(s[st]=='^') num[cnt]=qpow(t1,t2);
st--;
}
int main(){
cin>>a;
n=strlen(a);
if(a[0]=='-') num[++cnt]=0;
for(int i=0;i<n;i++){
if(i!=0&&a[i]=='-'&&a[i-1]!='+'&&a[i-1]!='-'&&a[i-1]!='^'&&a[i-1]!=')'){
num[++cnt]=0;
}
if(i!=0&&a[i]=='-'&&a[i-1]=='*'){
num[++cnt]=-1;
while(st&&yxj('*',0)<=yxj(s[st],1)) suan();
s[++st]='*';
}
if(i!=0&&a[i]=='-'&&a[i-1]=='/'){
num[++cnt]=-1;
while(st&&yxj('/',0)<=yxj(s[st],1)) suan();
s[++st]='/';
}
if(pan(a[i])){
num[++cnt]=0;
while(pan(a[i])) num[cnt]=num[cnt]*10+a[i]-'0',i++;
i--;
continue;
}
if(!st){
s[++st]=a[i];
continue;
}
if(a[i]==')'){
while(st&&s[st]!='(') suan();
st--;
}
else{
while(st&&yxj(a[i],0)<=yxj(s[st],1)) suan();
s[++st]=a[i];
}
}
while(st) suan();
cout<<num[cnt];
return 0;
}
题名:表达式计算4