您的位置:首页 > 其它

华为oj 四则运算

2017-03-27 09:27 387 查看
描述

请实现如下接口

/* 功能:四则运算

* 输入: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

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <cctype>
using namespace std;
unsigned int i = 0;
char str[100];
int T();
int E1(int);
int T2();
int E2(int);
int E(){
int anst = T();
return E1(anst);
}

int T()
{
int preresult = T2();
return E2(preresult);
}

int E1(int preresult){      //加减计算
int ans = preresult;
if(i < strlen(str)){
if(str[i] == '+'){
i++;
int nextNum = T();
preresult = preresult+nextNum;
ans = E1(preresult);   //连加、减的情况
}
else if(str[i] == '-'){
i++;
int nextNum = T();
preresult = preresult-nextNum;
ans = E1(preresult);
}
}
return ans;
}

int E2(int preresult){     //乘除计算
int ans = preresult;
if(i < strlen(str)){
if(str[i] == '*'){
i++;
int nextNum = T2();
preresult = preresult*nextNum;
ans = E2(preresult);   //连乘、除的情况
}
else if(str[i] == '/'){
i++;
int nextNum = T2();
preresult = preresult/nextNum;
ans = E2(preresult);
}
}
return ans;
}

int T2(){
int res = 0;
int sign = 1;  //正负号
if(i < strlen(str)){
if(str[i] == '-'){
sign = -1;
i++;
}
if(isalnum(str[i])){
while(i < strlen(str) && isalnum(str[i])){
res = res*10 + (str[i] - '0');
i++;
}
res = res*sign;
}
else if(str[i] == '(' || str[i] == '[' || str[i] == '{'){
char bracket = str[i];
i++;
res = E();
if(i < strlen(str)){
if((bracket == '(' && str[i] == ')') ||
(bracket == '[' && str[i] == ']') ||
(bracket == '{' && str[i] == '}'))
i++;
}
}
}
return res;
}

int main(){
i = 0;
while(cin >> str){
int res = E();
cout << res << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: