您的位置:首页 > 其它

华为OJ(四则运算)

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

描述
请实现如下接口
/* 功能:四则运算     * 输入: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<string>
#include<stack>
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<char> optr; //只处理+ - # / () [] {}运算
stack<int> 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<<CaculateExpression(s);
/*int flag=1;
for(int i=0;i<s.size();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<<res<<endl;
cout<<"true"<<endl;
}
else
cout<<"false"<<endl;*/
system("pause");
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: