标签: rpn

如何使用 RPN 解析一元运算符?

给定中缀表达式-190 + 20,正确的 RPN 结果会是什么样子?

-190 + 20 == -190 20 +

或者..

-190 + 20 == 190 - 20 +

一元运算符(负数)的规则是否与其他运算符相同,但只是right结合属性,并且优先级更高?

类似的表达式如下: -(9 + 9)

将会? -(9 + 9) = 9 - 9 +

math rpn unary-operator postfix-notation

4
推荐指数
1
解决办法
1051
查看次数

中缀到Postfix和一元/二元运算符

我有一段代码将中缀表达式转换为内存中的表达式树.这很好用.只有一个小问题.我只是想弄清楚如何正确地使用一元运算符(正确的关联运算符).

使用以下中缀表达式:

+1 + +2 - -3 - -4
Run Code Online (Sandbox Code Playgroud)

我希望RPN为:

1+2++3-4--
Run Code Online (Sandbox Code Playgroud)

然而,我能找到的在线中缀后转换器都没有像我期望的那样处理这个例子.有没有人对处理右关联运算符有明确的解释,特别是那些可以被误认为是一元运算符的二元运算符?

编辑/澄清:我想知道如何在从中缀到后缀的翻译过程中处理一元运算符.即:识别相同的' - '字符,例如是一元而不是二元运算符,因此具有不同的优先级.我会想到使用状态机可能有两个状态但是......?

c# math rpn

3
推荐指数
1
解决办法
7461
查看次数

Regexp问题涉及反向抛光计算器

我正在尝试使用正则表达式来解决反向抛光计算器问题,但我遇到了将数学表达式转换为常规形式的问题.

我写:

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)

但我得到了不同的结果.我究竟做错了什么?

ruby regex rpn calculator

2
推荐指数
1
解决办法
420
查看次数

在Erlang中,如何在使用递归时返回字符串?

我真的无法更好地表达问题,但这是我的问题:我想使用代码将中缀表达式转换为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)

erlang rpn infix-notation postfix-notation erl

2
推荐指数
1
解决办法
325
查看次数

如何在数学表达式求值程序中修复此错误

我在F#中为简单的数学表达式(用一些自定义函数算术)编写了一个典型的求值器.虽然它似乎工作正常,但某些表达式没有按预期进行评估,例如,这些工作正常:

  • 评估"5 + 2" - > 7
  • 评价"sqrt(25)^ 2" - > 25
  • eval"1 /(sqrt(4))" - > 0.5
  • eval"1 /(2 ^ 2 + 2)" - > 1/6~0.1666 ......

但这些不是:

  • eval"1 /(sqrt(4)+2)" - >评估为1/sqrt(6)~0.408 ...
  • eval"1 /(sqrt 4 + 2)" - >也将评估为1/sqrt(6)
  • eval"1 /( - 1 + 3)" - >计算结果为1 /( - 4)〜-0.25

代码如下工作,标记化(字符串作为输入) - >到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)

f# rpn eval pattern-matching

0
推荐指数
1
解决办法
133
查看次数

浮动加法 2.5 + 2.5 = 4.0?RPN

下面的代码是我做反向波兰符号计算的子程序......基本上是+、-、*和/。程序中一切正常,除了当我尝试添加 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)

c rpn calculator

-3
推荐指数
1
解决办法
413
查看次数