- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想将代表数学表达式的一棵树转换成实际的数学表达式(一个像"a+b/c"
)
树表示是您能想到的最简单的:
A+B/C
就是这棵树:
OperationNode(+, A, OperationNode(/, B, C))
(A+B)/C
就是这棵树:
OperationNode(/, OperationNode(+, A, B), C)
为了将树转换为字符串,我使用了访问者模式。问题来自括号。
我当前的 Visitor 实现总是向节点添加括号,所以我生成的每棵树都变成了这样的字符串:
(((A+B)+C)+D)
注意多余的括号。
所以问题是:如何让我的访问者生成没有多余括号的字符串?
最佳答案
正如 NelFeal 在遍历树时所写,您只需要检查子操作的优先级是否低于当前操作的优先级。
我为您实现了访问者模式,希望对您有所帮助。
enum Operation
{
Add,
Multiply,
Power,
UnaryMinus,
None,
}
static class OperationExtensions
{
public static string ToFriendlyString(this Operation me)
{
switch (me)
{
case Operation.None:
return "";
case Operation.Add:
return "+";
case Operation.Multiply:
return "*";
case Operation.Power:
return "^";
case Operation.UnaryMinus:
return "-";
default:
throw new ArgumentException();
}
}
}
class OperationNode
{
public Operation Op;
public OperationNode(Operation op)
{
Op = op;
}
}
interface IVisitor
{
void Visit(OperationNodeLeaf node);
void Visit(OperationNode1 node);
void Visit(OperationNode2 node);
}
sealed class Visitor : IVisitor
{
public string Text { get; set; }
private void Enclose(OperationNode subNode, Operation op)
{
if (subNode.Op < op)
{
Text = Text + "(";
Visit((dynamic)subNode);
Text = Text + ")";
}
else
{
Visit((dynamic)subNode);
}
}
public void Visit(OperationNodeLeaf node)
{
Text = Text + node.Op.ToFriendlyString();
Text = Text + node.Value.ToString();
}
public void Visit(OperationNode1 node)
{
Text = Text + node.Op.ToFriendlyString();
Enclose(node.SubNode, node.Op);
}
public void Visit(OperationNode2 node)
{
Enclose(node.LeftSubNode, node.Op);
Text = Text + node.Op.ToFriendlyString();
Enclose(node.RightSubNode, node.Op);
}
}
class OperationNodeLeaf : OperationNode
{
public int Value;
public OperationNodeLeaf(int v, Operation op = Operation.None) : base(op)
{
Value = v;
}
void Accept(IVisitor v)
{
v.Visit(this);
}
}
class OperationNode1 : OperationNode
{
public OperationNode SubNode;
public OperationNode1(OperationNode sn, Operation op) : base(op)
{
SubNode = sn;
}
void Accept(IVisitor v)
{
v.Visit(this);
}
}
class OperationNode2 : OperationNode
{
public OperationNode LeftSubNode;
public OperationNode RightSubNode;
public OperationNode2(OperationNode lsn, OperationNode rsn, Operation op) : base(op)
{
LeftSubNode = lsn;
RightSubNode = rsn;
}
void Accept(IVisitor v)
{
v.Visit(this);
}
}
class Program
{
static void Main(string[] args)
{
var tree =
new OperationNode2(
new OperationNode2(
new OperationNode2(new OperationNodeLeaf(5), new OperationNodeLeaf(6), Operation.Add),
new OperationNode2(new OperationNodeLeaf(5), new OperationNodeLeaf(6), Operation.Multiply),
Operation.Power
),
new OperationNode2(
new OperationNode2(new OperationNodeLeaf(1), new OperationNodeLeaf(2), Operation.Multiply),
new OperationNode1(new OperationNodeLeaf(7, Operation.None), Operation.UnaryMinus),
Operation.Add
),
Operation.Multiply
);
var visitor = new Visitor();
visitor.Visit(tree);
System.Diagnostics.Debug.WriteLine(visitor.Text);
}
}
(5+6)^(5*6)*(1*2+-7)
关于java - 将表示数学表达式的树转换为没有多余括号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53467194/
Based on Deep Learning (2017, MIT) book. 本文基于Deep Learning (2017, MIT),推导过程补全了所涉及的知识及书中推导过程中跳跃和省
因此,我需要一种方法来弄清楚如何获得5个数字,并且当您将它们中的任意两个相加时,将得出一个总和,您只能通过将这两个特定的数字相加而得到。 这是我正在谈论的示例,但有3个数字: 1个 3 5 1 + 3
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
如何将 a 和 b 之间的数字线性映射到 c 和 d 之间。 也就是说,我希望 2 到 6 之间的数字映射到 10 到 20 之间的数字...但我需要广义的情况。 我的脑子快炸了。 最佳答案 如果您的
嘿,我有一个方程式,我需要弄清楚它是基于图表的数学,其中图表上有两个点,需要获取其余值: 我正在构建一个 javascript 页面,它获取图表上的两个点,但需要吐出图表上的任何位置。 它用于根据了解
有谁知道如何用 Doxygen 得到实复场或射影平面的符号,i.o.w 符号,如 IR、IC、IP 等? 例如,我尝试了\f$\field{R}\f$,但无法识别。 非常感谢您的帮助,G. 最佳答案
我正在使用 Segment to Segment 最接近方法,该方法将输出两个长度段之间的最近距离。每个段对应一个球体对象的起点和终点。速度只是从一个点到另一个点。 即使没有真正的碰撞,最近的方法也可
我有一个 arduino 连接到 Stradella 系统钢琴 Accordion 。我在左手和弦的 12 个音符中的每一个上都有光学传感器。当我弹奏和弦时,它会触发三个传感器。如果我想让合成器演奏和
我正在开发一个具有一些简单功能的新包。现在我可以使用已经存在的“math-vectors”库中的函数;特别是“插值”和“反转”。如何在我的新包中使用这些?编写 y:=reverse(...) 显然是不
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Integer division in JavaScript 希望这是一个简单的问题,基本上我需要这样做: 分隔线
我有一张表格,上面有学校类(class)。此表单上可以有任意数量的类,每个类有 2 个字段。书本费和学费。 我有一个名为总计的第三个字段,当他们在其他字段中输入成本时,我想更新该字段。 这就是我的设置
今天早些时候我问了一个类似的问题,结果发现我只是数学很烂,因为我也无法解决这个问题。 我通过宽度/高度计算屏幕比例。我需要一个函数来将结果数字转换为新的比例。 例如 function convertN
我有一个起始数字,因此必须仅在开始循环时将该数字乘以一个因子,然后将结果乘以另一个因子的 X 倍,然后必须将循环乘以 Y 次,最后我需要总金额...我认为最好查看数字来了解我需要什么 例如,如果我从数
现在我用 JAVA 遇到了一些问题,但不记得如何获取坐标系之间的长度。 例如。A 点 (3,7)B点(7,59) 我想知道如何计算a点和b点之间的距离。非常感谢您的回答。 :-) 最佳答案 A = (
我有两种类型的文本输入,积极的和可疑的。在将输入到这两种类型的输入中的所有数字相加后,我需要显示多组这些输入的总数。例如:2 个阳性 + 2 个可疑 = 总计:4 然后,我需要从总数中找出积极与可疑的
我正在尝试将输入金额乘以 3.5%,任何人都可以给我任何想法如何做到这一点吗? $("#invest_amount").keyup(function() { $('#fee').va
有谁知道返回a的最大数的Math方法 给定的位数。 例如,使用1位数字的最大数字是9,2是99,3是999,4是9999......等等。 使用字符串很容易实现,但这并不完全 我在找什么。 pri
我是 Knockout 的新手,但仍对它一头雾水,我想知道如何使用两个 KO 变量进行简单的数学运算(加法和乘法)。 此刻我有: self.popInc1 = ko.observable('0.3')
我在谷歌地图应用程序中有以下内容,并希望显示转换为英尺的海拔高度,但如何向上/向下舍入到最接近的数字? (消除小数点后的数字)我尝试了 number.toFixed(x) 方法,但似乎什么也没做。 f
我最近开始使用 JavaScript 编写小型 Canvas 游戏,并试图全神贯注于 Vector 2d 数学。我了解 Vectors 的基础知识(比如它们代表 2d 空间中具有方向的点,您可以对它们
我是一名优秀的程序员,十分优秀!