问题标签 [postfix-notation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
12142 浏览

c++ - 在 C++ 中使用堆栈评估后缀

我已经更改了代码并设法获得了“pop”值,但该操作不起作用。

0 投票
1 回答
340 浏览

java - 代码中的堆栈跟踪

我想知道如何将跟踪添加到此代码的堆栈中,将中缀转换为表达式的 postix。

0 投票
3 回答
2403 浏览

c# - C# 为 ++ 运算符生成 IL - 何时以及为何前缀/后缀表示法更快

由于这个问题是关于增量运算符和前缀/后缀符号的速度差异,我将非常仔细地描述这个问题,以免 Eric Lippert 发现它并激怒我!

(有关我为什么要询问的更多信息和详细信息,请访问 http://www.codeproject.com/KB/cs/FastLessCSharpIteration.aspx?msg=3899456#xx3899456xx/

我有四个代码片段如下: -

(1) 分开,前缀:

(2) 分开,后缀:

(3) 索引器,后缀:

(4) 索引器,前缀:

我试图做的是证明/反驳在这种情况下前缀和后缀表示法之间是否存在性能差异(即一个局部变量,因此不是易失性的,不能从另一个线程更改等),如果有,为什么会这样.

速度测试表明:

  • (1) 和 (2) 以相同的速度运行。

  • (3) 和 (4) 以相同的速度运行。

  • (3)/(4) 比 (1)/(2) 慢约 27%。

因此,我得出的结论是,选择前缀表示法而不是后缀表示法本身并没有性能优势。但是,当实际使用操作的结果时,这会导致代码比简单地丢弃更慢。

然后我查看了使用 Reflector 生成的 IL 并发现以下内容:

  • IL 字节数在所有情况下都是相同的。

  • .maxstack 在 4 到 6 之间变化,但我认为这仅用于验证目的,因此与性能无关。

  • (1) 和 (2) 生成完全相同的 IL,因此时序相同也就不足为奇了。所以我们可以忽略(1)。

  • (3) 和 (4) 生成了非常相似的代码 - 唯一相关的区别是 dup 操作码的定位以说明操作的结果。同样,时间相同也就不足为奇了。

因此,我比较了 (2) 和 (3) 以找出可能导致速度差异的原因:

  • (2) 两次使用 ldloc.0 操作(一次作为索引器的一部分,然后作为增量的一部分)。

  • (3) 使用 ldloc.0 紧跟一个 dup op。

因此,对于 (1) (和 (2)) 递增 j 的相关 IL 是:

(3) 看起来像这样:

(4) 看起来像这样:

现在(终于!)这个问题:

(2) 是否更快,因为 JIT 编译器识别出一种模式,ldloc.0/ldc.i4.1/add/stloc.0即简单地将局部变量增加 1 并对其进行优化?(并且dup(3)和(4)中的存在打破了这种模式,因此错过了优化)

还有一个补充:如果这是真的,那么至少对于(3),不会dup用另一个ldloc.0重新引入该模式来替换 吗?

0 投票
1 回答
220 浏览

c - postfix evaluator not working

For some reason, when I execute this program with the following expression 12 12 * 66 + it returns an invalid and negative answer -46. I'm curious as is to what is going wrong, and would like to fix it asap.

0 投票
5 回答
1153 浏览

python - python中的小语言

我正在写一些在 python 中甚至可能不被称为语言的东西。我目前有几个运算符:+, -, *, ^, fac, @, !!. fac计算阶乘,@返回变量的值,!!设置变量。代码如下。我将如何编写一种用这种简单语言定义函数的方法?

编辑:我更新了代码!

0 投票
1 回答
5976 浏览

algorithm - 后缀到中缀表达式转换算法

任何人都可以为我提供与 Postfix 到 Infix 表达式转换算法相关的任何资源吗?

例子会很有帮助。

0 投票
0 回答
300 浏览

postfix-notation - 应用语言可以使用后缀表示法吗?

我一直发现像 Factor 这样的后缀语言比前缀(Lispy 语言)和中缀/后缀语言(所有 C 风格的语言,如果我们同时包含运算符和函数)更具可读性。

与前缀语言不同,您不需要处处使用分隔符。与中缀表示法不同,没有复杂的优先顺序要记住。有什么不喜欢的?

这些语言似乎都是串联的,因此几乎总是基于堆栈的。

是否可以实现一种现代语言,它适用于连接,并且仍然基于后缀?

0 投票
6 回答
595 浏览

coding-style - 我可以写 {x,a,b}//Do[...,#]& 而不是 Do[...,{x,a,b}] 吗?

我爱上了鲁比。在这种语言中,所有核心功能实际上都是方法。这就是为什么我更喜欢后缀符号的原因——当我要处理的数据放在匿名处理函数体的左侧时,例如:array.map{...}. 我相信,它的优势在于这段代码的易读性。

但是 Mathetica 具有功能性(是的,如果您愿意,它可以是程序性的)决定了一种样式,其中函数名称位于数据的左侧。正如我们在其手册中看到的那样,//仅当它是一些简单的函数时使用,没有参数,例如list // MatrixForm. 当 Function 需要大量参数时,编写手册的人会使用 syntax F[data]
没关系,但我的问题就是这种情况F[f,data],例如Do[function, {x, a, b}]。大多数 Mathematica 函数(如果不是全部)的参数完全按照这个顺序 - [function, data],而不是[data, function]. 由于我更喜欢​​使用纯函数来保持命名空间的清洁,而不是在我的笔记本中创建大量命名函数,所以参数function可能太大——太大了,那个参数data将放置在函数调用行之后的第 5-20 行代码中。

这就是为什么有时,当邪恶的 Ruby 天性使我受到控制时,我会以 postfix 的方式重写这些函数:

Do[f (x), {x, a, b}]\n{x, a, b} // Do[f (x), #] &

因为这对我很重要,所以纯函数(可能是大代码)是直接从处理数据中放置的。是的,我做到了,我很高兴。但是有两点:

  1. 这会导致 Mathematica 的高亮解析器问题:xin 后缀符号以蓝色突出显示,而不是青绿色;
  2. 每次我查看 Mathematica 手册时,我都会看到这样的示例:Do[x[[i]] = (v[[i]] - U[[i, i + 1 ;; n]].x[[i + 1 ;; n]])/ U[[i, i]], {i, n, 1, -1}];,这意味着......地狱,他们认为它很容易阅读/支持/等等。?!

所以这两件事让我在这里问这个问题:我是不是很坏,使用我的 Ruby 风格,我应该像这些人那样编写代码,还是可以,我不必担心,应该随心所欲地写?

0 投票
2 回答
2839 浏览

java - 在后缀评估上实现 Java 算法时需要帮助

我尝试从头开始编写此代码、编码并运行它,但它似乎不起作用。这被分配为课堂上的实验室工作。要求是: 使用堆栈和堆栈操作(用户定义)实现后缀评估。我认为我的程序的算法是正确的,但它总是给我错误的答案。这是我的代码。

示例输出:输入后缀形式以评估:

0 投票
1 回答
6528 浏览

java - 识别中缀到后缀转换中的括号

这是我必须为我的数据结构类制作的一个 java 类。我知道这远不是进行转换的最佳方法,但它与他在课堂上提供的伪代码不同,因此是他正在寻找的。他留给我们自己弄清楚的唯一一件事是算法如何识别括号。当我输入一个没有它们的表达式时,程序运行得很好,但是在我添加括号的那一刻,程序将无法运行,具体来说,通过一些调试,我发现右括号是这样做的“)”。我用注释标记了方法的实际括号部分所在的位置。谢谢您的帮助!