题目描述 Description
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值
数据可能会出现括号情况 还有可能出现多余括号情况
数据保证不会出现>maxlongint的数据
数据可能回出现负数情况
【题目分析】
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char s[51],sym[51];
int l,cnt=0,p=0,i,num[51];
void push()
{sym[++p]=s[i];}
bool can()
{
if (sym[p]=='^') return 1;
if ((s[i]=='+'||s[i]=='-')&&sym[p]!='(') return 1;
if ((s[i]=='*'||s[i]=='/')&&(sym[p]=='*'||sym[p]=='/')) return 1;
return 0;
}
int pow(int a,int b)
{
int ret=1;
for (int j=1;j<=b;++j)
ret*=a;
return ret;
}
void pop()
{
switch (sym[p--])
{
case'+':num[p]+=num[p+1]; break;
case'-':num[p]-=num[p+1]; break;
case'*':num[p]*=num[p+1]; break;
case'/':num[p]/=num[p+1]; break;
case'^':num[p]=pow(num[p],num[p+1]); break;
}
}
int main()
{
scanf("%s",s+1);
l=strlen(s+1);
for (i=1;i<=l;++i)
{
if (s[i]=='(') cnt++;
if (s[i]==')') cnt--;
}
sym[++p]='(';
while (cnt>=0)
{
s[++l]=')';
cnt--;
}
// printf("%s\n",s+1);
i=1;
while (i<=l)
{
// printf("%d\n",i);
while (s[i]=='(') {push();++i;}
int x=0;
while (s[i]>='0'&&s[i]<='9') x=x*10+s[i++]-'0';
num[p]=x;
do
{
if (s[i]==')')
{
while (sym[p]!='(') pop();
p--;
num[p]=num[p+1];
}
else
{
while (can()) pop();
push();
}
++i;
}while (i<=l&&s[i-1]==')');
}
printf("%d\n",num[0]);
}