我想编写一个函数来评估作为列表传递的后缀表达式。到目前为止,我有:
def evalPostfix(text):
s = Stack()
for symbol in text:
if symbol in "0123456789":
s.push(int(symbol))
if not s.is_empty():
if symbol == "+":
plus = s.pop() + s.pop()
if symbol == "-":
plus = s.pop() - s.pop()
if symbol == "*":
plus = s.pop() * s.pop()
if symbol == "/":
plus = s.pop() / s.pop()
Run Code Online (Sandbox Code Playgroud)
但我认为我有错误的方法。帮助?
我今天读了书.它介绍了从中缀到后缀的编码算法.有什么好处?提前致谢.
我正在寻找中缀符号的算法后缀,它将产生最小数量的括号.
我发现它会产生很多很多括号:http://tajendrasengar.blogspot.com/2011/09/postfix-to-infix-algorithm.html
例如
输入:
<ONP>abcd*/+~
Run Code Online (Sandbox Code Playgroud)
结果:
<INF>~(a+b/(c*d))
Run Code Online (Sandbox Code Playgroud) 我真的无法更好地表达问题,但这是我的问题:我想使用此代码将中缀表达式转换为Erlang中的postfix表达式,但它只写入控制台输出.问题是,我需要返回一个列表或字符串,所以我可以将它用作其他函数中的参数.
-module(foo).
-compile(export_all).
parse(Str) ->
{ok, Tokens, _} = erl_scan:string(Str ++ "."),
{ok, [E]} = erl_parse:parse_exprs(Tokens),
E.
rpn({op, _, What, LS, RS}) ->
rpn(LS),
rpn(RS),
io:format(" ~s ", [atom_to_list(What)]);
rpn({integer, _, N}) ->
io:format(" ~B ", [N]).
p(Str) ->
Tree = parse(Str),
rpn(Tree),
io:format("~n").
Run Code Online (Sandbox Code Playgroud)
例如,我想要像这样:
Str = "2 * (3 + 4)".
module:p(Str) =:= "2 3 4 + *".
module:anotherFunction(p(Str)).
Run Code Online (Sandbox Code Playgroud) 对于我的数据结构类,我必须使用 Python 3 创建一个基本的图形计算器。要求是我们必须使用一个基本的 Stack 类。用户以“中缀”形式输入方程,然后我应该将其转换为“后缀”以进行评估和绘图。我在使用中缀到后缀算法时遇到问题。我见过其他可以工作的算法,但我的教授希望它以某种方式完成。这是我到目前为止所拥有的:
def inFixToPostFix():
inFix = '3*(x+1)-2/2'
postFix = ''
s = Stack()
for c in inFix:
# if elif chain for anything that c can be
if c in "0123456789x":
postFix += c
elif c in "+-":
if s.isEmpty():
s.push(c)
elif s.top() =='(':
s.push(c)
elif c in "*/":
if s.isEmpty():
s.push(c)
elif s.top() in "+-(":
s.push(c)
elif c == "(":
s.push(c)
elif c == ")":
while s.top() is not '(':
postFix += s.pop()
s.pop()
else: …Run Code Online (Sandbox Code Playgroud) 为什么该代码由于错误而无法编译:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << ++(i++) << " " << i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然该代码确实编译:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << (++i)++ << " " << i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不明白这个.从我的观点来看,编译第一个块是非常合理的.表达式++(i ++)只是意味着取i,递增它并输出,然后再递增它.
我不是在询问int溢出中的未定义行为.在写这个问题时我根本不知道r和l值,我不在乎为什么++我被认为是l值,但i ++不是.
在Java和C#中如果我这样做:
int i=1;
int j= i++ + i;
Run Code Online (Sandbox Code Playgroud)
j是3,即它转换为1 + 2并在加法之前递增i.
但是,在C j中是2,即它转换为1 + 1然后递增i.
C和Java/C#中的内部机制是什么导致表达式的差异?
(同样适用于后期修复.Java/C#变为4,C变为3.)
谢谢.
顺便说一句,最初我认为这将是C答案,因此被Java/C#结果搞糊涂了.
我为后缀求值器编程,并且我能够正确地为个位数编号。现在我需要了解如何处理多位数,因为我当前的程序将两位数评估为不同的数字。
这是代码:
public class PostfixEvaluation {
public static void main(String[] args) {
String postfix = "23+79*-";
Stack stack = new Stack();
for (int i = 0; i < postfix.length(); i++) {
if (postfix.charAt(i) == '+') {
int v1 = stack.pop();
int v2 = stack.pop();
stack.push(v2 + v1);
} else if (postfix.charAt(i) == '-') {
int v1 = stack.pop();
int v2 = stack.pop();
stack.push(v2 - v1);
} else if (postfix.charAt(i) == '*') {
int v1 = stack.pop();
int v2 = stack.pop(); …Run Code Online (Sandbox Code Playgroud) 我想创建一个以中缀形式给出表达式的表达式树。是否需要先将表达式转换为后缀,然后再创建树?我知道这在某种程度上取决于问题本身。但假设它是带有未知数和运算符的数学函数的简单表达式,例如:/ * ^ + -。
infix-notation expression-trees postfix-notation data-structures
我正在尝试使用Shunting-yard算法,所以我开始研究它.在这样做的同时,我发现了一些我不太了解的有趣文档:
// Current token is a number, push
// it to stack for numbers.
else if(isdigit(tokens[i])){
int val = 0;
// There may be more than one
// digits in number.
while(i < tokens.length() &&
isdigit(tokens[i]))
{
val = (val*10) + (tokens[i]-'0');
i++;
}
values.push(val);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在里面while,变量val乘以10(val=(val*10)).有人可以帮助我理解为什么算法必须这样做?