一下午的成果???
//遇到优先级小于栈顶时计算
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stack>
#include<cstring>
#define ll long long
using namespace std;
stack<ll>num;
stack<char>f;
ll len;
string a,b,c;
ll k[100];
void cal()//无脑的计算
{
char b[1];
b[0]= f.top();
f.pop();
ll y=num.top();num.pop();//x y<-----顺序
ll x=num.top();num.pop();
if(b[0]=='+')
{
num.push(x+y);
}
else if(b[0]=='-')
{
num.push(x-y);
}
else if(b[0]=='*')
{
num.push(x*y);
}
else if(b[0]=='/')
{
num.push(x/y);
}
else if(b[0]=='^')
{
ll ret=1;
while(y--)
{
ret*=x;
}
num.push(ret);
}
}
int main()
{
k['+']=k['-']=1;
k['*']=k['/']=2;
k['^']=3;
a="(";
cin>>b;
a+=b;
c=")";
a+=c;//前后加上括号方便运算
// cout<<a<<'\n';
ll numb=0,fu=1;//当前要压进栈的数字以及数字的正负
len=a.length();
for(ll i=0;i<len;i++)//枚举字符
{
if(a[i]=='-'&&a[i-1]=='(') fu=-1;//该数字是负数
else if(a[i]<='9'&&a[i]>='0') //记录数字的过程
{
numb*=10;
numb+=a[i]-'0';
}
else
{
if(i-1>=0&&a[i-1]<='9'&&a[i-1]>='0')//遇到运算符或者括号就把记录的数字压进栈
{
num.push(numb*fu);
fu=1;
numb=0;
}
if(a[i]==')' )
{
while(!f.empty()&&f.top()!='(')//遇见右括号就一直向左运算到左括号
cal();
if(!f.empty()&&f.top()=='(') f.pop();//弹掉左括号
}
else if(!f.empty()&&k[a[i]]<=k[f.top()]&&a[i]!='(')//如果当前运算符小于上一个运算符 那就先计算上一个运算符
{
while(!f.empty()&&k[a[i]]<=k[f.top()]&&a[i]!='(')
cal();
f.push(a[i]);//再把当前运算符压入符号栈
}
else f.push(a[i]);
}
}
printf("%lld\n",num.top());
}