中级 四则运算(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;
}