给定中缀表达式-190 + 20,正确的 RPN 结果会是什么样子?
-190 + 20 == -190 20 +?
或者..
-190 + 20 == 190 - 20 +?
一元运算符(负数)的规则是否与其他运算符相同,但只是right结合属性,并且优先级更高?
类似的表达式如下:
-(9 + 9)
将会?
-(9 + 9) = 9 - 9 +?
我有一段代码将中缀表达式转换为内存中的表达式树.这很好用.只有一个小问题.我只是想弄清楚如何正确地使用一元运算符(正确的关联运算符).
使用以下中缀表达式:
+1 + +2 - -3 - -4
Run Code Online (Sandbox Code Playgroud)
我希望RPN为:
1+2++3-4--
Run Code Online (Sandbox Code Playgroud)
然而,我能找到的在线中缀后转换器都没有像我期望的那样处理这个例子.有没有人对处理右关联运算符有明确的解释,特别是那些可以被误认为是一元运算符的二元运算符?
编辑/澄清:我想知道如何在从中缀到后缀的翻译过程中处理一元运算符.即:识别相同的' - '字符,例如是一元而不是二元运算符,因此具有不同的优先级.我会想到使用状态机可能有两个状态但是......?
我正在尝试使用正则表达式来解决反向抛光计算器问题,但我遇到了将数学表达式转换为常规形式的问题.
我写:
puts '35 29 1 - 5 + *'.gsub(/(\d*) (\d*) (\W)/, '(\1\3\2)')
Run Code Online (Sandbox Code Playgroud)
打印:
35 (29-1)(+5) *
Run Code Online (Sandbox Code Playgroud)
预期
(35*((29-1)+5))
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) 我在F#中为简单的数学表达式(用一些自定义函数算术)编写了一个典型的求值器.虽然它似乎工作正常,但某些表达式没有按预期进行评估,例如,这些工作正常:
但这些不是:
代码如下工作,标记化(字符串作为输入) - >到rev-polish-notation(RPN) - > evalRpn
我认为问题似乎发生在一元函数(函数接受一个运算符)的某处,这些是sqrt函数和negation( - )函数.我真的没有看到我的代码出了什么问题.有人可能会指出我在这里缺少的东西吗?
这是我在F#中的实现
open System.Collections
open System.Collections.Generic
open System.Text.RegularExpressions
type Token =
| Num of float
| Plus
| Minus
| Star …Run Code Online (Sandbox Code Playgroud) 下面的代码是我做反向波兰符号计算的子程序......基本上是+、-、*和/。程序中一切正常,除了当我尝试添加 2.5 和 2.5 时,程序给了我 4.0 ......我想我知道为什么,但我不知道如何解决它......现在我正在阅读所有根据此分配的要求,从命令行输入数字和运算符,然后使用该字符串并使用 sscanf 从中获取数字......我在想包含三个字符“2”、“.”的数组,和'5',并没有完全转换为浮点数......相反,我认为只有'2'是。有人可以看看我的代码并确认或否认这一点,并可能告诉我如何修复它以便我得到正确的答案吗?预先感谢您的任何帮助!
float
fsm (char mystring[])
{
int i = -1, j, k = 0, state = 0;
float num1, num2, ans;
char temp[10];
c_stack top;
c_init_stack (&top);
while (1)
{
switch (state)
{
case 0:
i++;
if ((mystring[i]) == ' ')
{
state = 0;
}
else if ((isdigit (mystring[i])) || (mystring[i] == '.'))
{
state = 1;
}
else if ((mystring[i]) == '\0')
{
state = 3;
}
else
{
state …Run Code Online (Sandbox Code Playgroud)