(华为OJ)C 语言—中级四则运算

中级 四则运算(c语言作答)

中级 四则运算 分值:200分

描述

请实现如下接口
/* 功能:四则运算
* 输入:strExpression:字符串格式的算术表达式,如: “3+2*{1+2*[-4/(8-6)+7]}”
* 返回:算术表达式的计算结果
/
public static int calculate(String strExpression)
{
/
请实现*/
return 0;
}
约束:
pucExpression字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。
pucExpression算术表达式的有效性由调用者保证;

运行时间限制 10M
内存限制 128
输入
输入一个算术表达式
输出
得到计算结果
样例输入 3+2*{1+2*[-4/(8-6)+7]}
样例输出 25

我在网上看了一下,大部分都是用c++和java解答的,我就用c做了一下,欢迎指点
思路和我们平时的运算思路相同,先算括号后乘除最后加减。
运用两个数组分别存放运算符号和运算数据。

代码如下

/************************************************************************
*      文件名:arithmetic
*      文件功能描述:四则运算
*      文件作者名:Mr_han QQ:785937095
*      说明:
*       1、给定一个字符串描述的算术表达式,计算出结果值。
*       2、合法的字符包括”+, -, *, /, (, )”,”0-9”,‘[’, ‘]’,‘{’ ,‘}’
*       3、字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LONG long
#define CHAR char
#define N    100


LONG Operation ( CHAR buf[] )
{
    CHAR sym[N] = "";         /*用来存放运算符号*/
    CHAR temp[N] = "";        /*用来存放中间变量*/
    LONG s, n, i, t, m, sum;
    LONG num[N] = {0};        /*用来存放运算数据*/
    i = t = s = n = sum = 0;

    while ( '\0' != buf[i] )  /*轮询表达式,将{}\[]\()中的表达式先进行运算*/
    {
        if ( '{' == buf[i] )
        {
            i++;
            while ( '}' != buf[i] )
            {
                temp[t++] = buf[i++];
            }
            ltoa ( Operation ( temp ), temp, 10 ); /*将得到的结果转换成字符串*/
            t = strlen ( temp );
            while ( t-- )
            {
                buf[i--] = temp[t];
            }
            while ( '{' != buf[i] )                /*将结果放到{ }表达式的末尾,将其他位用0替换*/
            {
                buf[i--] = '0';
            }
            buf[i] = '0';
        }else if ( '[' == buf[i] )
        {
            i++;
            while ( ']' != buf[i] )
            {
                temp[t++] = buf[i++];
            }
            ltoa ( Operation ( temp ), temp, 10 ); /*将得到的结果转换成字符串*/
            t = strlen ( temp );
            while ( t-- )
            {
                buf[i--] = temp[t];
            }
            while ( '[' != buf[i] )                /*将结果放到[ ]表达式的末尾,将其他位用0替换*/
            {
                buf[i--] = '0';
            }
            buf[i] = '0';
        }else if ( '(' == buf[i] )
        {
            i++;
            t=0;
            while ( ')' != buf[i] )
            {
                temp[t++] = buf[i++];
            }
            ltoa ( Operation ( temp ), temp, 10 ); /*将得到的结果转换成字符串*/
            t = strlen ( temp );
            while ( t-- )
            {
                buf[i--] = temp[t];
            }
            while ( '(' != buf[i] )                /*将结果放到()表达式的末尾,将其他位用0替换*/
            {
                buf[i--] = '0';
            }
            buf[i] = '0';
        }
        i++;
    }
    i = t = 0;
    while ( '\0' != buf[i] )
    {
        while ( ('0' <= buf[i] && '9' >= buf[i]) || ('-' == buf[i] && 0 == i))   /*将运算数据按顺序逐一放入数组*/
        {
            temp[t++] = buf[i++];
        }
        temp[t] = '\0';
        t = 0;
        num[n++] = atol ( temp );
        while ( '+' == buf[i] || '-' == buf[i] || '*' ==buf[i] || '/' == buf[i] ) /*将运算符号按顺序逐一放入数组*/
        {
            sym[s++] = buf[i++];
        }
    }


    for ( i = 0; i < s; i++ )
    {
        if ( sym[i] == '*' || sym[i] == '/' )   /*轮询运算符数组,将*|/找出先进行运算*/
        {
            if ( '*' == sym[i] )
            {
                num[i] = num[i] * num[i+1];     /*将结果替换前一个数,并将后面所有的数前移一位*/
            }else
            {
                num[i] = num[i] / num[i+1];
            }
            n--;
            for ( m = i+1; m < n; m++ )
            {
                num[m] = num[m+1];              /*将后面所有的数前移一位*/
            }
            s--;
            for ( m = i; m < s; m++ )
            {
                sym[m] = sym[m+1];              /*将后面所有的运算符号前移一位*/
            }
            i--;                                /*因将后面的符号前移了一位,故需要重新查看这一位,判断是否为*|/ */
        }
    }
    for ( i = 0; i < s; i++ )                   /*最后一遍轮询求和、求差*/
    {
        switch ( sym[i] )
        {
        case '+':
            num[i+1] = num[i] + num[i+1];
            break;
        case '-':
            num[i+1] = num[i] - num[i+1];
            break;
        }
    }
    //printf ( "sum = %d\n", num[i] );

    return num[i];
}

void main()
{
    CHAR buf[N] = "";
    while ( 1 )
    {
        printf ( "请输入表达式:" );
        gets ( buf );
        if ( 0 == strcmp ("quit", buf ) ) break;
        printf ( "结果为:%d\n", Operation ( buf ));
    }

    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值