计算表达式的值

Description

输入一个只包含+,-,*,(,)的数字运算式(中缀表达式),求出他的计算结果。
例如,输入5*(7-3)+9,输出29

Input

一个中缀表达式。

Output

表达式的计算结果。

Sample Input

5*(7-3)+9

 

Sample Output

29

 

Hint

输入的表达式的长度不超过100,最终结果和中间结果不会超过integer
保证输入的字符串一定是一个中缀表达式,不需要检测错误!

Source

 

 

做法:先把表达式转换成中缀表达式。

        逐个压入栈中,遇到符号弹出2个。

 

 

很短的代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
char s[201],op[201],q[201];
long a[201];
long i,j,k;
int fun(){
    gets(s);
    j
=-1;
    
for (i=0;i<strlen(s);i++){
        
if (s[i]=='(')
             q[
++k]='(';
        
else if (s[i]==')'){
             
while (q[k]!='('){
                 op[
++j]=q[k--];
             }
             k
--;
        }
else if (s[i]=='+' || s[i]=='-'){
            
while(k>=0 && q[k]!='(')
                op[
++j]=q[k--];
            q[
++k]=' ';
            q[
++k]=s[i];
        }
else if (s[i]=='*'){
            
while(k>=0 && q[k]!='(' && q[k]!='+' && q[k]!='-')
                op[
++j]=q[k--];
            q[
++k]=' ';
            q[
++k]=s[i];
        }
else{
            op[
++j]=s[i];
            
if(i==strlen(s)-1)
                op[
++j]=' ';
            
else if (s[i+1]>'9' || s[i+1]<'0')
                op[
++j]=' ';
        }
    }
    
while (k>=0)
        op[
++j]=q[k--];
    op[
++j]='\0';
    
return j;
}
int main(){
    
int p=0,o=0,i,k,j;
    j
=fun();
    
for (i=0;i<j;){
        
if (op[i]<='9' && op[i]>='0'){
            k
=0;
            p
++;
            
while (op[i]<='9' && op[i]>='0'){
                k
=k*10+op[i]-48;
                i
++;
            }
            a[p]
=k;
        }
else if (op[i]=='+'){
            a[p
-1]=a[p-1]+a[p];
            p
--;
            i
++;
        }
else if (op[i]=='-'){
            a[p
-1]=a[p-1]-a[p];
            p
--;
            i
++;
        }
else if (op[i]=='*'){
            a[p
-1]=a[p-1]*a[p];
            p
--;
            i
++;
        }
else i++;
    }
    printf(
"%ld\n",a[1]);

    
return 0;
}

 

 

转载于:https://www.cnblogs.com/yanrui7098/archive/2009/11/18/1605305.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值