2178 表达式运算Cuties

2178 表达式运算Cuties

 

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 Description

给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值

数据可能会出现括号情况 还有可能出现多余括号情况

数据保证不会出现>maxlongint的数据

数据可能回出现负数情况

输入描述 Input Description

仅一行,即为表达式

输出描述 Output Description

仅一行,既为表达式算出的结果

样例输入 Sample Input

(2+2)^(1+1)

样例输出 Sample Output

16

数据范围及提示 Data Size & Hint

表达式总长度<=30

分类标签 Tags 点此展开 

 
题解:
字符串表达式运算的模板
AC代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int N=52;
char s[N],sym[N];
int i,p,l,cnt,num[N];
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 fpow(int a,int b){
    int res=1;
    for(;b;b>>=1,a=a*a) if(b&1) res=res*a;
    return res;
}
void push(){
    sym[++p]=s[i];
}
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]=fpow(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]='(';
    for(;cnt>=0;cnt--) s[++l]=')';
    for(i=1;i<=l;){
        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",num[0]);
    return 0;
}
 
原文地址:https://www.cnblogs.com/shenben/p/6066337.html