Algorithm 表达式树的后缀表示法
关于如何将表达式树转换为后缀符号,有足够的资源,这并不难 但我必须将后缀表达式解析为表达式树 表达方式是: A 2^2 A*B*-B 2^+A B-/Algorithm 表达式树的后缀表示法,algorithm,language-agnostic,Algorithm,Language Agnostic,关于如何将表达式树转换为后缀符号,有足够的资源,这并不难 但我必须将后缀表达式解析为表达式树 表达方式是: A 2^2 A*B*-B 2^+A B-/ 我真的不知道如何解释这个表达。有人知道如何处理这个问题吗?创建一个包含可能是树的一部分的节点的堆栈 将堆栈上的操作数(a、2、B等都是操作数)作为叶节点推送,不绑定到任何方向的任何树 对于操作符,从堆栈中弹出必要的操作数,创建一个操作符位于顶部的节点,操作数悬挂在其下方,将新节点推到堆栈上 对于您的数据: 将一个容器推到堆栈上 将2推到堆栈上 弹
我真的不知道如何解释这个表达。有人知道如何处理这个问题吗?创建一个包含可能是树的一部分的节点的堆栈
// Add the following two using-directives to LINQPad:
// System.Drawing
// System.Drawing.Imaging
static Bitmap _Dummy = new Bitmap(16, 16, PixelFormat.Format24bppRgb);
static Font _Font = new Font("Arial", 12);
void Main()
{
var elementsAsString = "A 2 ^ 2 A * B * - B 2 ^ + A B - / 2 ^";
var elements = elementsAsString.Split(' ');
var stack = new Stack<Node>();
foreach (var element in elements)
if (IsOperator(element))
{
Node rightOperand = stack.Pop();
Node leftOperand = stack.Pop();
stack.Push(new Node(element, leftOperand, rightOperand));
}
else
stack.Push(new Node(element));
Visualize(stack.Pop());
}
void Visualize(Node node)
{
node.ToBitmap().Dump();
}
class Node
{
public Node(string value)
: this(value, null, null)
{
}
public Node(string value, Node left, Node right)
{
Value = value;
Left = left;
Right = right;
}
public string Value;
public Node Left;
public Node Right;
public Bitmap ToBitmap()
{
Size valueSize;
using (Graphics g = Graphics.FromImage(_Dummy))
{
var tempSize = g.MeasureString(Value, _Font);
valueSize = new Size((int)tempSize.Width + 4, (int)tempSize.Height + 4);
}
Bitmap bitmap;
Color valueColor = Color.LightPink;
if (Left == null && Right == null)
{
bitmap = new Bitmap(valueSize.Width, valueSize.Height);
valueColor = Color.LightGreen;
}
else
{
using (var leftBitmap = Left.ToBitmap())
using (var rightBitmap = Right.ToBitmap())
{
int subNodeHeight = Math.Max(leftBitmap.Height, rightBitmap.Height);
bitmap = new Bitmap(
leftBitmap.Width + rightBitmap.Width + valueSize.Width,
valueSize.Height + 32 + subNodeHeight);
using (var g = Graphics.FromImage(bitmap))
{
int baseY = valueSize.Height + 32;
int leftTop = baseY; // + (subNodeHeight - leftBitmap.Height) / 2;
g.DrawImage(leftBitmap, 0, leftTop);
int rightTop = baseY; // + (subNodeHeight - rightBitmap.Height) / 2;
g.DrawImage(rightBitmap, bitmap.Width - rightBitmap.Width, rightTop);
g.DrawLine(Pens.Black, bitmap.Width / 2 - 4, valueSize.Height, leftBitmap.Width / 2, leftTop);
g.DrawLine(Pens.Black, bitmap.Width / 2 + 4, valueSize.Height, bitmap.Width - rightBitmap.Width / 2, rightTop);
}
}
}
using (var g = Graphics.FromImage(bitmap))
{
float x = (bitmap.Width - valueSize.Width) / 2;
using (var b = new SolidBrush(valueColor))
g.FillRectangle(b, x, 0, valueSize.Width - 1, valueSize.Height - 1);
g.DrawRectangle(Pens.Black, x, 0, valueSize.Width - 1, valueSize.Height - 1);
g.DrawString(Value, _Font, Brushes.Black, x + 1, 2);
}
return bitmap;
}
}
bool IsOperator(string s)
{
switch (s)
{
case "*":
case "/":
case "^":
case "+":
case "-":
return true;
default:
return false;
}
}
//将以下两个using指令添加到LINQPad:
//系统图
//系统、绘图、成像
静态位图_Dummy=新位图(16,16,PixelFormat.Format24bppRgb);
静态字体_Font=新字体(“Arial”,12);
void Main()
{
var elementsastring=“A2^2A*B*-B2^+AB-/2^”;
var elements=elementsAsString.Split(“”);
var stack=新堆栈();
foreach(元素中的var元素)
if(等参器(元件))
{
节点右操作数=stack.Pop();
节点leftOperator=stack.Pop();
Push(新节点(元素、左操作数、右操作数));
}
其他的
stack.Push(新节点(元素));
可视化(stack.Pop());
}
void可视化(节点)
{
node.ToBitmap().Dump();
}
类节点
{
公共节点(字符串值)
:此(值,null,null)
{
}
公共节点(字符串值、左节点、右节点)
{
价值=价值;
左=左;
右=右;
}
公共字符串值;
公共节点左;
公共节点权;
公共位图ToBitmap()
{
大小值大小;
使用(Graphics g=Graphics.FromImage(_Dummy))
{
var tempSize=g.MeasureString(值,字体);
valueSize=新尺寸((int)tempSize.Width+4,(int)tempSize.Height+4);
}
位图;
颜色值Color=Color.LightPink;
if(Left==null&&Right==null)
{
位图=新位图(valueSize.Width、valueSize.Height);
valueColor=Color.LightGreen;
}
其他的
{
使用(var leftBitmap=Left.ToBitmap())
使用(var rightbimat=Right.ToBitmap())
{
int subNodeHeight=Math.Max(leftBitmap.Height,righbitmap.Height);
位图=新位图(
leftBitmap.Width+rightBitmap.Width+valueSize.Width,
valueSize.Height+32+子节点高度);
使用(var g=Graphics.FromImage(位图))
{
int baseY=valueSize.Height+32;
int leftTop=baseY;//+(subNodeHeight-leftBitmap.Height)/2;
g、 DrawImage(leftBitmap,0,leftTop);
int rightTop=baseY;//+(子节点高度-rightBitmap.Height)/2;
g、 DrawImage(rightBitmap,bitmap.Width-rightBitmap.Width,rightTop);
g、 绘图线(Pens.Black,bitmap.Width/2-4,valueSize.Height,leftBitmap.Width/2,leftTop);
g、 绘图线(Pens.Black,bitmap.Width/2+4,valueSize.Height,bitmap.Width-rightBitmap.Width/2,rightTop);
}
}
}
使用(var g=Graphics.FromImage(位图))
{
浮点x=(bitmap.Width-valueSize.Width)/2;
使用(var b=新的SolidBrush(valueColor))
g、 圆角矩形(b,x,0,valueSize.Width-1,valueSize.Height-1);
g、 DrawRectangle(画笔,黑色,x,0,valueSize.Width-1,valueSize.Height-1);
g、 抽绳(数值、字体、画笔、黑色、x+1、2);
}
返回位图;
}
}
布尔等参器(串s)
{
开关
{
案例“*”:
案例“/:
案例“^”:
格“+”:
案例“-”:
返回true;
违约:
返回false;
}
}
输出:
这看起来正确吗:
for n in items:
if n is argument:
push n
if n is operator:
b = pop // first pop shall yield second operand
a = pop // second pop shall yield first operand
push a+n+b
answer = pop
A 2 ^ 2 A * B * - B 2 ^ + A B - /
在Station上运行此操作将产生一个堆栈,其演变如下:
[A]
[A, 2]
[A^2]
[A^2, 2]
[A^2, 2, A]
[A^2, 2*A]
[A^2, 2*A, B]
[A^2, 2*A*B]
[A^2-2*A*B]
[A^2-2*A*B, B]
[A^2-2*A*B, B, 2]
[A^2-2*A*B, B^2]
[A^2-2*A*B+B^2]
[A^2-2*A*B+B^2, A]
[A^2-2*A*B+B^2, A, B]
[A^2-2*A*B+B^2, A-B]
[A^2-2*A*B+B^2/A-B]
是的,这比我将要发布的内容更容易理解。谢谢,但这并不完全正确。在第3步和第4步之间,你忘记了在堆栈上推一个2。堆栈反转操作数,因此必须在堆栈上放置b+n+a