111,093
社区成员




class Program
{
static void Main(string[] args)
{
var s = "M+(F/(A-D/(B+C)))";
var expr = new Expression();
expr.Match(s);
Console.WriteLine(expr.InorderTraversal());
}
}
public class EtreeNode
{
public static readonly EtreeNode Empty;
public string Value;
public EtreeNode Left;
public EtreeNode Right;
}
public class Expression
{
public Stack<EtreeNode> ptrStack = new Stack<EtreeNode>();
string[] Symbol = { "+", "-", "*", "/", "(", ")" };
List<string> Pretreatment(string str)
{
var res = new List<string>();
var tmp = "";
foreach(var c in str)
{
if (Symbol.Contains(c.ToString()) || c.ToString() == " ")
{
if (tmp.Length > 0)
{
res.Add(tmp);
tmp = "";
}
res.Add(c.ToString());
}
else if(c != ' ') tmp += c;
}
if (tmp.Length > 0)
{
res.Add(tmp);
tmp = "";
}
return res;
}
public List<string> InfixToSuffix(List<string> a, int x=0, int y=-1)
{
var res = new List<string>();
if (y < 0) y = a.Count;
int p = 0, c1 = -1, c2 = -1;
if (y - x <= 1)
{
res.Add(a[x]);
return res;
}
for (int i = x; i < y; i++)
{
switch (a[i])
{
case "(": p++; break;
case ")": p--; break;
case"+":
case"-":
if (p == 0) c1 = i;
break;
case "*":
case "/":
if (p == 0) c2 = i;
break;
}
}
if (c1 < 0) c1 = c2;
if (c1 < 0) res.AddRange(InfixToSuffix(a, x + 1, y - 1));
else
{
res.AddRange(InfixToSuffix(a, x, c1));
res.AddRange(InfixToSuffix(a, c1 + 1, y));
res.Add(a[c1]);
}
return res;
}
public void Match(string str)
{
var a = Pretreatment(str);
Console.WriteLine(string.Join(" ", a));
if (Symbol.Contains(a[0]) || Symbol.Contains(a[1])) a = InfixToSuffix(a);
Console.WriteLine(string.Join(" ", a));
foreach (var c in a)
{
var ptr = new EtreeNode();
if (Symbol.Contains(c))
{
ptr.Value = c;
ptr.Right = ptrStack.Pop();
ptr.Left = ptrStack.Pop();
ptrStack.Push(ptr);
}
else
{
ptr.Value = c;
ptr.Left = ptr.Right = EtreeNode.Empty;
ptrStack.Push(ptr);
}
}
}
public string InorderTraversal()
{
return InorderTraversal(ptrStack.Peek());
}
public string InorderTraversal(EtreeNode r) //递归进行中序遍历
{
var res = new StringBuilder();
if (r == EtreeNode.Empty) return res.ToString();
if (Symbol.Contains(r.Value)) res.Append("(");
if (r.Value == "/") res.Append("0 if(" + InorderTraversal(r.Right) + "==0) else "); //这里!
res.Append(InorderTraversal(r.Left)); //引用左子树
res.Append(r.Value); //引用根节点
res.Append(InorderTraversal(r.Right)); //引用右子树
if (Symbol.Contains(r.Value)) res.Append(")");
return res.ToString();
}
}