博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算表达式的值
阅读量:6642 次
发布时间:2019-06-25

本文共 1334 字,大约阅读时间需要 4 分钟。

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

你可能感兴趣的文章
JavaScript 各种遍历方式详解,有你不知道的黑科技
查看>>
华三模拟器配置DHCP
查看>>
好程序员教程分享关于ajax对象一些常见的问题总结
查看>>
手持终端应用的主要事项
查看>>
ajax的第一天
查看>>
将excel中的数据导入到oracle数据库中
查看>>
SCCM 2012 R2 配置(五)
查看>>
casperjs模拟登录-jd无验证码登录
查看>>
搭建安装oracle数据库
查看>>
下划线按钮
查看>>
extmail
查看>>
部署Windows Server 2016基于工作组的集群
查看>>
CSS 定义的四种方法
查看>>
Counting Stars
查看>>
关于HTTP_X_FORWARDED_FOR
查看>>
C++中 容易忽视的const 修饰符
查看>>
基础概念扫盲篇之一- “三次握手“
查看>>
Linux下群集和存储管理之Heartbeat+DBRD+NFS
查看>>
CCNA 学习笔记(九)--交换知识(NAT)
查看>>
我的友情链接
查看>>