后缀到中缀对话
Postfix to Infix conversation
>我无法从后缀到中缀解决这个表达式。请帮助我详细了解
5 x y - / x y + 3 ^ 7 / +
这不是代码,而是方式,您应该将后缀扩展到中缀:
5 x y-/x y + 3 ^ 7/+
5 (x-y)/xy+ 3^ 7/+
(5/(x-y)) xy+ 3^ 7/+
(5/(x-y)) (x+y)3^ 7/+
(5/(x-y)) ((x+y)^3) 7/+
(5/(x-y)) (((x+y)^3)/7) +
(5/(x-y)) + (((x+y)^3)/7)
这相当简单:
- 您读取参数并决定它是值还是变量。如果是,则在堆栈上推送参数。如果不是,则为操作员。
- 如果您有运算符,则可以创建一个树,该树由作为根的运算符和堆栈的参数与其子级一样多的参数组成。你把树推到堆栈上。
- 当您要打印中缀表示法时,您需要按顺序遍历堆栈顶部(原始的后修复表示法只是同一树的后序遍历)。
为了在C++中解决这个问题,我创建了一个基类(Expression
),其派生类代表不同类型的节点(Value
、Variable
和BinaryOperation
)并维护一个std::stack<std::shared_ptr<Expression>>
。编码出来主要是一个打字练习。
缀到中缀:
5 x y - / x y + 3 ^ 7 / +
步
5 x y -/
A) 5xy-/= 5 (x-y)/= (5/(x-y))
x y +
B) x y + = (x + y)
(x+y) 3 ^
B.1) (x + y) 3 ^ = ((x + y) ^ 3 )
现在, (5/(x-y)) ((x + y) ^ 3 ) 7/+
= (5/(x-y)) (((x + y) ^ 3 )/7 ) + = (5/(x-y)) + (((x + y) ^ 3 )/7 )
POSTFIX 和 PREFIX 是不使用括号的表达式。运算符的优先级是按照表达式中出现的顺序决定的,因此要计算表达式无需搜索下一个要执行的操作 - FAST。
在 INFIX 表达式中,运算符的优先级被括号覆盖。 因此中缀表达式中有括号 - 需要搜索要执行的操作,例如 A+B%D - 因此很慢。
这就是转换在计算机科学中有用的原因。
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- std::字符串与 PCWSTR 的对话
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何检测窗口当前是否正在运行模式对话框?
- "最小化"按钮不会出现在 MFC 对话框中
- 如何用C++写一个基本的来回对话
- 来自C++结构编程中的中缀表达式的表达式树
- 如何获取QNetworkConfiguration UserChoice对话框?
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何在 VC6 中的对话框中将图标设置为按钮
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 后缀到中缀对话