标签:style blog io color ar os 使用 sp 数据
数据结构题集(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 else 145 { 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 }
标签:style blog io color ar os 使用 sp 数据
原文地址:http://www.cnblogs.com/jackdawson/p/4088158.html