首页 > 代码库 > 数据结构 -- 整数算术表达式求值 (C/C++)
数据结构 -- 整数算术表达式求值 (C/C++)
数据结构题集(C语言版)--严蔚敏,吴伟民编著
- 设置运算符栈和运算数栈辅助分析运算符有限关系。
- 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算。
- 在识别出运算数的同时,要将其字符序列形式转换成整数形式。
1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include <stack>//使用标准库中的栈 9 using namespace std; 10 11 //判断运算符栈中的相邻两个运算符的优先级。 12 int judgePrecede(int c1,int c2) 13 { 14 int precede; 15 switch(c1) 16 { 17 case ‘+‘:precede = (c2 == ‘*‘|| c2 == ‘/‘|| c2 == ‘(‘) ? ‘<‘ : ‘>‘;break; 18 case ‘-‘:precede = (c2 == ‘*‘|| c2 == ‘/‘|| c2 == ‘(‘) ? ‘<‘ : ‘>‘;break; 19 case ‘*‘:precede = (c2 == ‘(‘) ? ‘<‘ : ‘>‘;break; 20 case ‘/‘:precede = (c2 == ‘(‘) ? ‘<‘ : ‘>‘;break; 21 case ‘(‘: 22 if(c2 == ‘#‘) 23 { 24 cout<<"Expression you entered maybe is wrong"<<endl; 25 return 0; 26 } 27 precede = (c2 == ‘)‘) ? ‘=‘ : ‘<‘;break; 28 case ‘)‘: 29 if(c2 == ‘(‘) 30 { 31 cout<<"Expression you entered maybe is wrong"<<endl; 32 return 0; 33 } 34 precede = ‘>‘;break; 35 case ‘#‘: 36 if(c2 == ‘)‘) 37 { 38 cout<<"Expression you entered maybe is wrong"<<endl; 39 return 0; 40 } 41 precede = (c2 == ‘#‘) ? ‘=‘ : ‘<‘;break; 42 } 43 return precede; 44 } 45 46 //判断是否是运算符。 47 bool isOperator(char c) 48 { 49 switch(c) 50 { 51 case‘+‘: 52 case‘-‘: 53 case‘*‘: 54 case‘/‘: 55 case‘(‘: 56 case‘)‘: 57 case‘#‘:return true; 58 default:return false; 59 } 60 } 61 //判断是否是0-9的数字。 62 bool isNum(char c) 63 { 64 return (c>=48&&c<=57) ? true :false; 65 } 66 67 //计算a与b的结果。 68 int Operate(int a,char theta,int b) 69 { 70 int c; 71 switch(theta) 72 { 73 case ‘+‘: 74 c=a + b; 75 break; 76 case ‘-‘: 77 c=a - b; 78 break; 79 case ‘*‘: 80 c=a * b; 81 break; 82 case ‘/‘: 83 if(b == 0) 84 { 85 cout<<"Divisor cannot be zero"<<endl; 86 exit(0); 87 } 88 c=a / b; 89 } 90 return c; 91 } 92 93 //计算表达式。 94 int evaluateExpression() 95 { 96 stack<int> OPND; 97 stack<char> OPTR; 98 int a,b,temp; 99 char c,d,theta;100 OPTR.push(‘#‘);101 c = getchar();102 while(c != ‘#‘||OPTR.top() != ‘#‘)//当表达式未结束时循环。103 {104 //如果c为运算符。 105 if(isOperator(c))106 switch(judgePrecede(OPTR.top(),c))107 {108 //运算符栈中如果前一个运算符优先级小于后一个运算符优先级,则把c压入运算符栈中。 109 case ‘<‘:110 OPTR.push(c);111 c = getchar();112 break;113 //运算符栈中如果前一个运算符优先级大于后一个运算符优先级,则计算数字栈中的栈顶两数的结果。 114 case ‘>‘:115 b = OPND.top();116 OPND.pop();117 a = OPND.top();118 OPND.pop();119 theta = OPTR.top();120 OPTR.pop();121 temp = Operate(a,theta,b);122 OPND.push(temp);//将计算结果压入数字栈中。 123 break;124 //运算符栈中如果前一个运算符优先级等于后一个运算符优先级。 125 case ‘=‘:126 OPTR.pop();//弹出与运算符优先级级相等的运算符。 127 c = getchar();128 break;129 }130 //如果c为数字。 131 else if(isNum(c))132 {133 temp = c - 48;//把字符c化为与数字。134 d = getchar();135 while(isNum(d))//如果d也为数字,则把d与c计算后加起来。 136 {137 temp = 10 * temp + (d - 48);138 d = getchar();139 }140 OPND.push(temp);141 c = d;//d为运算符,赋值给c。 142 }143 //如果不是运算符也不是数字0-9。144 else145 {146 cout<<"Input Error"<<endl;147 exit(0);148 }149 }150 return OPND.top();//返回最终计算结果。151 }152 153 int main(int argc, int *argv[])154 {155 while(1)156 {157 cout<<"Input Expression(Enter # to end input):";158 cout<<evaluateExpression()<<endl;159 cout<<"Press Enter to Exit"<<endl;160 fflush(stdin); 161 }162 return 0;163 }
数据结构 -- 整数算术表达式求值 (C/C++)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。