为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。
在这里,我们还必须使用堆栈数据结构来解决后缀表达式。
从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使用。完成整个表达式后,最终结果也将存储在堆栈顶部。
Input: Postfix expression: 53+62/*35*+ Output: The result is: 39
postfixEvaluation(postfix)
输入:要计算的后缀表达式。
输出: 评估后缀形式后的答案。
Begin for each character ch in the postfix expression, do if ch is an operator ⨀ , then a := pop first element from stack b := pop second element from the stack res := b ⨀ a push res into the stack else if ch is an operand, then add ch into the stack done return element of stack top End
#include<iostream> #include<cmath> #include<stack> using namespace std; float scanNum(char ch) { int value; value = ch; return float(value-'0'); //return float from character } int isOperator(char ch) { if(ch == '+'|| ch == '-'|| ch == '*'|| ch == '/' || ch == '^') return 1; //character is an operator return -1; //not an operator } int isOperand(char ch) { if(ch >= '0' && ch <= '9') return 1; //character is an operand return -1; //not an operand } float operation(int a, int b, char op) { //执行操作 if(op == '+') return b+a; else if(op == '-') return b-a; else if(op == '*') return b*a; else if(op == '/') return b/a; else if(op == '^') return pow(b,a); //find b^a else return INT_MIN; //return negative infinity } float postfixEval(string postfix) { int a, b; stack<float> stk; string::iterator it; for(it=postfix.begin(); it!=postfix.end(); it++) { //读取元素并执行后缀评估 if(isOperator(*it) != -1) { a = stk.top(); stk.pop(); b = stk.top(); stk.pop(); stk.push(operation(a, b, *it)); }else if(isOperand(*it) > 0) { stk.push(scanNum(*it)); } } return stk.top(); } main() { string post = "53+62/*35*+"; cout << "The result is: "<<postfixEval(post); }
输出结果
The result is: 39
我正在编写一段代码,对给定的后缀表达式求值。每个操作数和运算符之间用空格分隔,最后一个运算符后跟空格和“x”。 例子: 内插表达式:(2*3 4)*(4*3 2) 后缀表达式:23*443*2*x “x”暗示表达的结束。 输入(后缀表达式)作为字符串由另一个函数给出,该函数将内缀表达式转换为后缀表达式。 后缀评估的功能是: 我给出的例子的输出应该是“140”,但我得到的是“6”。请帮我找出错误。
问题内容: 什么是实现将采用字符串并根据运算符优先级输出结果的python程序的最佳方法(例如:“ 4 + 3 * 5”将输出19)。我在谷歌上寻找解决这个问题的方法,但是它们都太复杂了,我正在寻找一个(相对)简单的方法。 澄清:我需要比eval()稍微先进的东西-我希望能够添加其他运算符(例如,最大运算符-4 $ 2 = 4),或者,我对此在学术上比对专业更感兴趣-我想知道 该怎么 做。 问题答
我理解经典例子的问题 但我无法说服自己以下是有效的还是无效的 我知道'foo(i)'和'i'的求值顺序是不确定的,但是'评估'到底是什么意思?也就是说bar的第二个参数总是42,或者'i'的当前值可以在foo改变它之前被传入吗?
问题内容: 我正在寻找简单条件表达式的评估器。表达式应包含变量(只读),字符串,数字和一些基本运算符。 例如,这样的表达式: 到目前为止,我实现了一个相当“神奇”的解析器,该解析器返回可以评估的AST,但我不敢相信我是解决该问题的第一个。 我可以使用哪些现有代码代替? 问题答案: SPEL(Spring Expression Lang)怎么样?http://static.springsource.
问题内容: 我有一个在Tomcat 5.5上运行的JSP页面。我有以下代码: 我得到的输出是: 我无法弄清楚为什么forEach循环有效,但输出无效。任何人可能提供的任何帮助都将是巨大的。 问题答案: 我知道默认情况下应该启用它,但是我一次又一次地跨页面(甚至是更改行为的同一页面)运行EL处理不会发生的页面。将以下内容添加到任何此类页面的顶部应可解决此问题: 我将它添加到每个页面中,因为它不会造成
问题内容: 在以下示例中: test.html test1.html script1.js 发生fn testFn执行4次。我希望在控制台中只能看到2条日志。即使,即使我删除 有2个日志,而不仅仅是一个。我怎么了 更新: angular.js test.html 安慰 问题答案: 更新: 在对视图表达式进行插值并运行摘要循环时,Angular会至少对每个表达式重新运行/插值至少两次,以便在渲染之前