第四:堆栈操纵运营商

2021-05-15 03:21:53

在本章中,我们将在我们继续之前潜入一些您需要知道的细节。具体地,我们将介绍一些算术指令,因此您将能够在数学方程中写入数学方程。

与计算器不同,计算机终端没有用于乘法或划分的特殊密钥。相反,我们使用*和/。

在第一章中,我们了解到,我们可以通过将它们放在堆栈上,然后执行Word +,然后最后执行单词来添加两个数字。 (点)将结果打印在我们的终端。

我们可以通过所有的算术运算符使用此方法。换句话说,我们可以像计算器一样使用以获得答案,即使没有写“程序”。尝试乘法问题:

到目前为止,我们已经看到操作员在数字之后。然而,在减法和分裂的情况下,我们还必须考虑数字的顺序(“7 - 4”与“4 - 7”不同)。

只需记住此规则:要转换为Postfix,只需将运算符移动到表达式的末尾。

单词/被定义为将堆栈上的第二个数字划分为顶部号码。

如果您在表达式中有多个操作员,您会怎么做,例如: 你问? 让我们逐步取下它:括号告诉您首先将十二次乘以十二,然后添加四个。 所以你会写: 然后四个进入堆栈,在204的顶部。+滚出添加机器并将它们添加在一起,只返回结果。 或假设您要添加五个数字。 你可以这样做: 要解决它,我们必须第一次添加三到九个,然后添加四到六个,然后最后乘以两句话。 我们可以写 请注意,我们非常方便地保存了堆栈的总和十二,而我们继续增加四到六个。 请记住,我们尚未遵守写作定义。 我们只是用计算器使用。

如果你是大多数初学者,你可能想尝试一些练习问题,直到你对后缀感到更舒服。 1. B + C *或C A B + * 2. 3 A * B - 4 / C + 3. A B * 100/2 /或B * 200 / 4.N 1+ N / 5. 7 x * 5 + x * 在chap。 1我们看到我们可以在数字和其他预定单词方面定义新单词。 让我们探讨一些新学习的数学运营商的一些进一步的可能性。 假设我们想将各种测量转换为英寸。 我们知道 名称象征着“码到英寸”和“脚到英寸”。 这是他们所做的: :院子36 *;↵好:脚12 *;↵好的:英寸;↵好的 请注意,除了提醒人类用户九个是的,单词英寸没有做任何事情。 如果我们真的想得到幻想,我们可以添加这三个定义:

:围场;↵好的:脚脚;↵好的:英寸;↵好的 因此,用户可以输入任何名词的奇异形式,仍然得到相同的结果: 1码2英尺+ 1英寸+。↵61OK 2码1英尺+。↵84 OK 到目前为止,我们只有定义了定义包含单个数学运算符的单词。 但如果这就是您需要执行的情况,这是完全可能的许多运营商。 让我们说我们想要一个单词计算堆栈上的五个数字的总和。 几页返回我们总结了五个数字: 我们得到了相同的答案,即使我们将所有数字群集成一个组和所有运算符到另一个组。 我们可以写下我们的定义: 如果我们要保留5#以供将来使用,我们可以进入我们不断增长的词汇表,并记下它在堆栈上“预计五个参数”,它将加起来。

如果喷射平面在平均空气速度下速度为600英里/小时,如果它在25英里/小时的尾风中飞,则在五小时内跳动? 如果我们定义 只要我们确保我们以正确的顺序输入参数; 将以下Invix表达式转换为索取定义,并显示定义所需的堆栈顺序。 由于这是Quizzie 2-B,因此您可以命名您的定义2b1,2b2等。 1.:2b2(c a b - 结果)4 * - 6 / +; 2.:2b3(a b - 结果)8 * /; 3.:2B4(A B - 结果)* 200 /; 4.:2b5(a - 结果)2 * 3 + *; 5.如果你说这个不可能,你就是对的! - 至少没有堆栈操纵运营商我们会很快介绍。 这个词/是最简单的分裂运算符。 斜线仅提供商品; 任何剩余的都丢失了。 如果您键入: 如果您正在考虑一个口袋计算器的每百分比运营商,那么五个不是完整的答案。

但是/ /只是几个分裂的运营商之一,为您提供灵活性,可以确切地告诉计算机您想要的内容。

例如,让我们说你想解决这个问题:“我可以换取22个宿舍的多少美元钞票?”当然,真正的答案正好是5,而不是5.5。例如,计算机化的货币兑换商将不知道如何给您5.5美元的账单。

这些运营商都签名,“截断”。我们将在计算机号的章节中看到这意味着什么。

/ mod给出剩余部分和商; mod(来自“modulo”)仅提供余数。 (for / mod,表中的堆栈表示法指示了商将位于堆栈的顶部,下面的余数。记住,最右边代表最顶层。)

这里/ mod执行划分并将堆栈上的商和余数放在堆栈中。第一个点打印商,因为商在上面。

如果你工作了。 6在最后一个集合中,您发现INVIX方程

除非有某种方式来重新排列堆栈上的值,否则无法解决定义。

嗯,有一种方法:通过使用称为交换的“堆栈操作操作员”。

Swap字样定义为切换前两个堆栈项的顺序。

与其他堆栈操作运营商一样,您可以在“计算器样式”中测试终端的交换;也就是说,它不必包含在定义中。

列表中的下一个堆栈操作操作员DUP,只需制作顶部堆栈项的第二个复制(重复)。

但是,你说,我需要一个新的操纵运营商:我想要两个“a”的副本,“a”是“b”的副本。这是你需要的这个词:结束。在简单地制作“A”的副本,并通过“B”来跨越它:

在写方程时,最好先将它们“为”。例如,如果有人要求您评估:

在迄今为止我们介绍的单词,你会发现它会发现它非常复杂(也许是不可能的)...除非你要考虑表达式阅读:

列表上的第四个堆栈机械手是腐烂(发音的小册子),这是“旋转”的短暂的。 ROT将前三个堆栈值从(a b c)转换为(b c a)。

列表中的最终堆栈操作操作员已删除。它确实丢弃了顶部堆栈值。

初学者只是学习以有用的方式操纵堆栈上的数字,经常发现自己键入一系列点,以在操纵后看到堆栈上的内容。但是,点的问题是,它们不会将数字留在堆栈上以供将来的操作。第四个词.S打印出恰好在堆栈上的所有值“非破坏性”;也就是说,没有去除它们。让我们测试它,首先在堆栈上没有什么:

正如您在此版本中看到的那样,我们至少看到一个数字。这是堆栈实际上的项目数。现在让我们在堆栈上尝试数字:

1 2 3。s↵3。 1 2 3 OK腐烂。< 3>↵23 1好

写一个短语,将三个物品翻转堆叠,留下中间的中间数字;那是,

写一个名为-rot的定义,它从腐烂旋转顶三堆叠物品的相反方向;那是,

1.交换腐烂2.交换DUP腐烂换档3.: - 腐烂腐烂; (你的第四可能已经有了它。)4。:2C4 DUP 1 +交换/;或者:2c4 dup 1+交换/; 5.:2C5 DUP 7 * 5 + *; 6.:2C6超过9 *交换 - *;

前缀“2”表示这些堆栈操作运算符成对处理数字。堆栈效果列中的字母“D”代表“双重”。 “双重”具有特别意义,当我们谈论“n”和“u”时我们会讨论。

上面列出的“2” - 管理者非常简单,我们甚至不会用例子烦恼。

还有一件事:还有一些堆栈的操纵者,我们还没有谈过,所以不要通过在堆栈上尝试太多的花哨的步法来疯狂。

整数包括超过18,446,744,073,709,551,615至+18,446,744,073,709,551,615(以及我们将正式介绍的范围)。7)。

落在-2亿到+2亿的整数范围内:唯一有效作为到目前为止讨论过的任何运营商的参数或结果的数字。

写一个短语,该短语将在堆栈上反转前四个项目的顺序;也就是说,(1 2 3 4 - 4 3 2 1)

写一个名为3dup的定义,它将复制堆栈上的三个数字; 例如,(1 2 3 - 1 2 3 1 2 3) 给出以下INVIX方程的写定义,给定显示:2 + AB + C(C a B - 结果)(A-B)/(A + B)(A B - 结果) 写一套单词来计算为硬化罪犯的监狱判决,使法官可以进入:或任何一系列犯罪,从被定罪和结尾的词汇服务。 使用这些句子: 您是Maria的鸡蛋牧场的库存程序员。 定义一个被称为堆栈的单词,今天鸡的鸡蛋总数并打印出可以填充有十几个的纸箱数量,以及剩余卵数。 DUP DUP两次重复顶部堆栈项,而2DUP重复两份顶部堆栈项一次。 (a b c d-d c b a)1 2 3 4交换2swap交换。 。 。 。 :3DUP(A B C - A B C A B C)DUP 2POVER腐烂;

:2-4a(驾驶室 - a ** 2 + ab + c)超过+ * +;:-rot(abc-cab)腐烂;:2-4b(ab - [ab] / [a + b ])2dup - -rot + /; :被定罪的( - 禁令)0;:arson(句子 - 句子+ 10)10 +;:凶杀案(句子+ 20)20 +;:书签(句子 - 句子+ 2)2 +;:逃税(句子 - 判决+ 5)5 +;:愿意服务(句子 - )。 。" 岁月" ; :鸡蛋.Cartons(全蛋 - )12 / mod。 。" 纸箱和" 。 。" 剩下的剩余; ;