需要帮助理解在高级反向波兰符号程序中如何使用堆栈和二进制搜索树



我有一个C语言的项目作业,我正在想办法如何做。我可以试着解释作业的所有部分,但我想引用整个内容会更有意义:

名称rpcalc-一个简单的RPN计算器

名称

rpcalc-一个简单的RPN计算器和转换工具

简介

rpcalc[-e|-c|-g]表达式

描述

rpcalc实用程序对用反向波兰符号书写的算术表达式结果转换为标准输出。

默认情况下(即,如果没有选项传递给程序)计算表达式。此行为也用于以下事件用户将命令行选项-e传递给程序。

如果用户传递命令行选项-c,则程序将表达式转换为其等价的中缀表示法,仅在必要时插入子表达式。

如果用户通过命令行选项g,则程序以模拟汇编语言生成一系列指令如果由假设的计算机执行,将评估表示程序输出的指令序列假定存在无限数量的机器寄存器。

输入语法

rpcalc实用程序假定输入表达式使用以下二进制运算符整数:

A表示加法S表示减法X表示乘法D-表示整数除法M-表示模数操作例如,程序可以按以下方式运行:

rpcalc 5 4+X 18 S 5 D 3 52

rpcalc-c 5 4+X 18 S 5 D 3((5+4)*18-5)/3

模拟汇编语言

通过使用-g选项输出的汇编语言是相当简单,包括以下说明:

MOV R#值

-R#表示编号寄存器(例如R1、R2…)

-VALUE表示整数

-此表格的说明读作:"将VALUE移入寄存器R#"。

添加R#1 R#2 R#3

-R#1、R#2和R#3表示不同的寄存器

-此表格的说明读作:"将寄存器R2的内容添加到

-寄存器R1的内容,将结果保存到寄存器R3">

SUB R#1 R#2 R#3

-R#1、R#2和R#3表示不同的寄存器

-此形式的指令读作:"从寄存器R1的内容中减去寄存器R2的内容,保存结果注册R3">

MUL R#1 R#2 R#3

-R#1、R#2和R#3表示不同的寄存器

-此形式的指令读作:"寄存器R1的内容乘以寄存器R2的内容,将结果保存到寄存器R3">

DIV R#1 R#2 R#3

-R#1、R#2和R#3表示不同的寄存器

-此形式的指令读作:"将寄存器R1的内容除以寄存器R2的内容,将商保存为寄存器R3">

MOD R#1 R#2 R#3

-R#1、R#2和R#3表示不同的寄存器

-此形式的指令读作:"将寄存器R1的内容除以寄存器R2的内容,将余数保存为寄存器R3">

WRT R#1

-R#1表示寄存器

-此表格的说明读作:"将R1的内容写入屏幕">

正如您所看到的,它不仅仅是一个简单的RPN计算器。本学期早些时候,我们不得不作为实验室做一个基本的RPN计算器,而我只是使用了堆栈实现。对于这个程序,我们的教授告诉我们最好的方法是使用堆栈和二进制搜索树。我希望有人能告诉我,为什么这个程序需要这两种数据结构,或者为什么它是最必要的。据我所见,我应该能够使用任何一种数据类型来完成程序,但看不出使用这两种数据类型的相关性。如果有人能解释他们对此的看法,我将不胜感激

感谢

我同意一个堆栈对于纯RPN实现来说就足够了。然而,似乎也支持带括号的中缀表示法,这需要在处理之前首先构建语法树。此外,您可以使用二叉树搜索与每个指令令牌相关的函数(我想您只有一个简单的switch .. case)。

然而,这只是一个粗略的猜测。

相关内容

最新更新