表达式求值+-*/
功能:能够实现+-*/运算。
思路:使用一个运算符栈和一个运算数栈,首先压入头部哨兵\n,
1)只要栈顶的符号的优先级小,就将当前运算符压栈;
2)栈顶优先级更高的话就将当前运算符出栈,如果是二目运算符就取出两个操作数,计算的结果压入操作数栈;当前运算符是左括号优先级最高,如果栈顶是左括号则优先级最低,当前运算符是右括号则优先级最低。
3)如果栈顶优先级相等,就是右括号或者尾部哨兵\n
相等的情况下,栈顶的优先级要大。
//实现 对 + - * / 的四则运算 #include<iostream> #include<stack> using namespace std; stack<char> OPND;// 运算数 stack<char> OPTR;//运算符 char cmp(char a, char b){//考虑情况 a是栈顶元素,b是当前元素 if ((a == '(' && b == ')') || (a == b && a == '\n')) {//左右括号的优先级相同,或者都是哨兵,这样表示一个括号运行完了 return '='; } if (a == '\n' || a == '(')//栈里面的左括号优先级是最低的 return '<'; if (b == '\n' || b == ')') //当前运算符的右括号的优先级是最高的 return '>'; if (b == '(') {//当前运算符是左括号优先级是最高的 return '<'; } int ta, tb;//+-是1,*/是2 if (a == '+' || a == '-') ta = 1; else ta = 2; if (b == '+' || b == '-') tb = 1; else tb = 2; return ta < tb ? '<':'>'; //这里隐含了一个情况 就是 如果ta==tb,此时应返回'>'; 栈顶的优先级要保证高 } char Opt(char a, char s, char b) { char t; switch (s) { case '+':t = a - 48 + b - 48 + 48; break; case '-':t = a - 48 - (b - 48) + 48; break; case '*':t = (a - 48) * (b - 48) + 48; break; case '/':t = (a - 48) / (b - 48) + 48; break; } return t; } int main(){ OPTR.push('\n'); char c; c = getchar(); while (c != '\n' || OPTR.top() != '\n') { if (c >= '0' && c <= '9') { OPND.push(c); c = getchar(); } else{//过滤不严 switch (cmp(OPTR.top(), c)){ case '<': OPTR.push(c); c = getchar(); break; case '=': OPTR.pop(); c = getchar(); break; case '>': char s = OPTR.top(); OPTR.pop(); char a, b, count; b = OPND.top(); OPND.pop(); a = OPND.top(); OPND.pop(); count = Opt(a, s, b); OPND.push(count); break; } } } cout << OPND.top() << endl; system("pause"); return 0; }