一、计算器实现的思路
在计算器的实现中,需要将用户输入的算式转换成计算机可以识别和处理的形式,然后进行计算并输出结果。
第一步是将用户输入的中缀表达式转换成后缀表达式,这样方便计算机进行计算。在转换中,需要注意运算符的优先级。
第二步是将转换后的后缀表达式利用栈进行计算,遇到操作数则压入栈中,遇到运算符则出栈两个操作数进行运算,并将运算结果压入栈中。
第三步是将栈中最后一个元素即为计算结果,将其输出给用户。
二、中缀转后缀的实现
中缀表达式转后缀表达式可以使用栈来实现,在将运算符压入栈中前需要弹出优先级比它高或相等的运算符。
vector infix2postfix(vector infix){ stack s; vector postfix; map priority; priority["+"] = 1; priority["-"] = 1; priority["*"] = 2; priority["/"] = 2; priority["("] = 0; for(int i=0;i=priority[token]){ postfix.push_back(s.top()); s.pop(); } s.push(token); } } while(!s.empty()){ postfix.push_back(s.top()); s.pop(); } return postfix; }
三、后缀表达式的计算实现
后缀表达式的计算可以使用栈来实现,在遇到操作数时将其压入栈中,在遇到运算符时弹出栈顶的两个元素进行计算,将结果再次压入栈中。
int eval_postfix(vector postfix){ stack s; for(int i=0;i<postfix.size();i++){ string token = postfix[i]; if(isdigit(token[0])){ s.push(stoi(token)); } else{ int b = s.top(); s.pop(); int a = s.top(); s.pop(); if(token=="+"){ s.push(a+b); } else if(token=="-"){ s.push(a-b); } else if(token=="*"){ s.push(a*b); } else{ s.push(a/b); } } } return s.top(); }
四、完整代码示例
#include #include #include
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/297149.html