c语言四则运算oj,华为OJ(四则运算)

真是怕啥来啥啊,这种题很愁人的,哎,不过还好,刚做过表达式求值,两道题的区别只是增加了中括号和大括号,刚好练练手啦,玩玩没想到,真是太麻烦了,现在只是解决了无负数输入的情况,对示例输入有负数情况还需要修改代码。o(╯□╰)o,放着以后再解决吧。

描述

请实现如下接口

/*功能:四则运算

*输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"

*返回:算术表达式的计算结果

*/

publicstaticintcalculate(String strExpression)

{

/*请实现*/

return0;

}

约束:

pucExpression字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。

pucExpression算术表达式的有效性由调用者保证;

知识点

运行时间限制

10M

内存限制

128

输入

输入一个算术表达式

输出

得到计算结果

样例输入

3+2*{1+2*[-4/(8-6)+7]}

样例输出

25

#include

#include

#include

using namespace std;

//运算符的优先关系

//'+', '-', '*', '/', '(', ')','[',']','{','}', '#'

char OprRelation[11][11]={{'>', '>', '', '','', '>'}, //'+'

{'>', '>', '', '','', '>'}, //'-'

{'>', '>', '>', '>', '', '','', '>'}, //'*'

{'>', '>', '>', '>', '', '','', '>'}, //'/'

{''}, //'('

{'>', '>', '>', '>', '=', '>', '>','>','>','>', '>'}, //')'

{''}, //'['

{'>', '>', '>', '>', '>', '>', '=','>','>','>', '>'}, //']'

{''}, //'{'

{'>', '>', '>', '>', '>', '>', '=','>','>','>', '>'}, //'}'

{'

bool IsOperator(char ch)

{

if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('

||ch==')'||ch=='['||ch==']'||ch=='{'||ch=='}'||ch=='#')

return true;

else

return false;

}

//将运算符转化为数组下标以便进行优先级比较

int ConvertToIndex(char opr)

{

int index;

switch (opr)

{

case '+':

index = 0;

break;

case '-':

index = 1;

break;

case '*':

index = 2;

break;

case '/':

index = 3;

break;

case '(':

index = 4;

break;

case ')':

index = 5;

break;

case '[':

index = 6;

break;

case ']':

index=7;

break;

case '{':

index=8;

break;

case '}':

index=9;

break;

case '#':

index=10;

break;

}

return index;

}

//运算符优先级比较

char Precede(char opr1, char opr2)

{

int index1 = ConvertToIndex(opr1);

int index2 = ConvertToIndex(opr2);

return OprRelation[index1][index2];

}

//进行运算符转化

int Operate(int opnd1, char op, int opnd2)

{

int ret;

switch(op)

{

case '+':

ret = opnd1 + opnd2;

break;

case '-':

ret = opnd1 - opnd2;

break;

case '*':

ret = opnd1 * opnd2;

break;

case '/':

ret = opnd1 / opnd2;

break;

}

return ret;

}

//运算符优先算法

int CaculateExpression(string exp)

{

stack optr; //只处理+ - # / () [] {}运算

stack opnd;

char ch;

int i = 0;

exp += "#";

optr.push('#');

ch = exp[i++];

//如果##配对,表达式求值完成

while (ch != '#' || optr.top() != '#')

{

if (!IsOperator(ch))

{

//操作数入栈

int a=0;

while(!IsOperator(ch))

{

a=a*10+ch-'0'; //将String转化为int

ch=exp[i++];

}

opnd.push(a);

}

else

{

//比较栈顶操作符和新取得的操作符的优先关系

switch (Precede(optr.top(), ch))

{

case '

optr.push(ch);

ch = exp[i++];

break;

case '='://括号配对,栈顶括号弹出

optr.pop();

ch = exp[i++];

break;

case '>'://栈顶优先权高,先弹出,计算,结果操作数入栈

char op = optr.top();

optr.pop();

int num2 = opnd.top();//第二个操作数在前

opnd.pop();

int num1 = opnd.top();

opnd.pop();

int ret = Operate(num1, op, num2);

opnd.push(ret);

break;

}

}

}//end of while

//操作数栈的唯一元素即为计算结果

return opnd.top();

}

int main()

{

char a[1025];

int res;

cin>>a;

string s=string (a);

cout<

/*int flag=1;

for(int i=0;i

if(!(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='('||s[i]==')'||isdigit(s[i])

||s[i]=='['||s[i]==']'||s[i]=='{'||s[i]=='}'))

{

flag=0;

break;

}

if(flag)

{

res=CaculateExpression(s);

cout<

cout<

}

else

cout<

system("pause");

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值