华为OJ(表达式求值)
来源:互联网 发布:开网店软件 编辑:程序博客网 时间:2024/06/06 13:03
/*
功能: 对输入的字符串表达式进行求值计算,并输出结果。
输入:String inputString:表达式字符串
返回: int :正常返回true,失败返回false
*/
public static boolean calculate(String inputString)
{
/*在这里实现功能*/
return true;
}
获取计算结果(int型)
public static int getResult()
{
/*在这里实现功能*/
return 0;
}
输入算术表达式
计算出结果值
#include <iostream>#include<stack> using namespace std;//区分判断表达式中的操作数和操作符bool IsOperator(char ch) { if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#') return true; else return false; } //运算符的优先关系 //'+', '-', '*', '/', '(', ')', '#' char OprRelation[7][7] = {{'>', '>', '<', '<', '<', '>', '>'}, //'+' {'>', '>', '<', '<', '<', '>', '>'}, //'-' {'>', '>', '>', '>', '<', '>', '>'}, //'*' {'>', '>', '>', '>', '<', '>', '>'}, //'/' {'<', '<', '<', '<', '<', '=', '>'}, //'(' {'>', '>', '>', '>', '=', '>', '>'}, //')' {'<', '<', '<', '<', '<', ' ', '='}};//'#' //将运算符转化为数组下标以便进行优先级比较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; } 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);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]))){flag=0;break;}if(flag){res=CaculateExpression(s);cout<<res<<endl;cout<<"true"<<endl;}elsecout<<"false"<<endl;//system("pause"); return 0;}
0 0
- 华为OJ(表达式求值)
- 华为OJ表达式求值
- 【华为OJ】【096-表达式求值】
- 华为OJ——表达式求值
- 表达式求值(OJ)
- 九度OJ 1101 表达式求值(栈的应用)
- 华为机试题之表达式求值
- 华为机试 - 题目4 - 表达式求值
- 南阳oj 表达式求值 题目305 数据结构
- BUAA OJ 722 Gzh之表达式求值
- 整数求值(华为上机)
- 表达式求值(上)
- 表达式求值(中)
- 表达式求值(下)
- 四则运算(表达式求值)
- 表达式求值(char)
- 表达式求值(nyoj305)
- 表达式求值(一)
- 快学Scala习题解答—第十章 特质
- C++内存地址分配和内存区划分简介
- SharedPreferences 存储
- CODE COMPLETE 2e Chapter 6
- I - 么
- 华为OJ(表达式求值)
- c++函数返回局部变量
- JVM 优化经验总结(原文已发表在IBM开发者论坛)
- N-Queens
- Ubuntu12.04 安装adb
- HDU-1257 最少拦截系统(LIS)
- 书摘---网络搜集整理 (11--20)
- C#操作datatable
- opencv学习笔记 split(图像分割为3通道)