算法3-4 表达式求值
2015-03-31 10:17
309 查看
/*题目描述 算数四则运算的规则是1)先乘除,后加减;2)从左算到右;3)先括号内,后括号外。 由此,算式4+2*3-10/5的计算顺序为4+2*3-10/5=4+6-10/5=4+6-2=8。 给定 一个以“#”作为结束符的算式,求出算式的结果。 输入 以“#”结尾的表达式,运算数为正整数。每个表达式占一行。 输出 输出表达式运算的结果。 样例输入 4+2*3-10/5# 3*(7-2)# 2*3/2# 样例输出 8 15 3 */ #include <stdio.h> #include <iostream> #include <stack> #include <cstring> #include <stdlib.h> using namespace std; #define OP_SIZE 7 #define MAX_SIZE 1000 #define TRUE 1 #define FALSE 0 #define ERROR -1 char OP[]={'+','-','*','/','(',')','#'}; char PRIOR[OP_SIZE][OP_SIZE] = { // 运算符优先级表 '>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=',' ', '>','>','>','>',' ','>','>', '<','<','<','<','<',' ','=' }; class Sqstack{ private: stack<int> DATA; stack<char> SIGN; public: bool IsSign(char op){ for(int i =0; i < OP_SIZE; i++) if (op == OP[i]) return TRUE; return FALSE; } int Opindex(char op){ for(int i =0; i < OP_SIZE; i++) if (op == OP[i]) return i; return ERROR; } int Culcurlate(int a,char sign,int b){ switch(sign) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; default : return 0; } } void Operate(char *MyExpression){ SIGN.push('#'); char temp[20]; int left, right ,a; char *c,Dr[]={'#','\0'}; c = strcat(MyExpression,Dr); strcpy(temp,"\0"); while(*c != '#' || SIGN.top() != '#'){ if(IsSign(*c)){ char pri = PRIOR[Opindex(SIGN.top())][Opindex(*c)]; switch(pri){ case '<':SIGN.push(*c);c++;break; case '>':a = SIGN.top();SIGN.pop(); right = DATA.top();DATA.pop(); left = DATA.top();DATA.pop(); DATA.push(Culcurlate(left,a,right));break; case '=':SIGN.pop();c++;break; default: c++;break; } } else{ Dr[0] = *c; strcat(temp,Dr); c++; if(IsSign(*c)){ DATA.push(atoi(temp)); strcpy(temp,"\0"); } } } cout << DATA.top() << endl; return; } }; int main(){ Sqstack S; char str[1000]; while(gets(str)) S.Operate(str); return 0; }
相关文章推荐
- 双栈算数表达式求值算法
- 使用传统算法进行表达式求值(数字支持科学表示法,操作符支持加减乘除乘方, 支持括号, 不支持函数)
- 后缀表达式的求值的算法
- 每天一道算法题(26)——输入字符串表达式求值
- 栈 表达式求值算法c/c++
- C++表达式求值(Stack and Expression)加州大学伯克利分校计算机专业数据结构与算法作业
- 写了个表达式求值的算法
- 每天一道算法题(26)——输入字符串表达式求值
- 【经典算法】-算术表达式求值
- 算法(第四版) Dijkstra 算数表达式求值算法-双栈
- 后缀表达式的求值的算法
- 后缀表达式的求值的算法
- 表达式求值算法总结
- 【算法】表达式求值--逆波兰算法介绍
- Dijkstra双栈算数表达式求值算法的过程与分析
- 算法-表达式求值
- 第六周--数据结构之自建算法库之表达式求值(用栈结构)
- java实现任意四则运算表达式求值算法
- 表达式求值算法----栈的应用
- 【算法】E.W.Dijkstra算术表达式求值