public static int Find_Near_LeftBracket(ArrayList alExpression, int iRightBracket) { for (int i = iRightBracket - 2; i >= 0; i--) { if (OperatorMap.CheckLeftBracket(alExpression[i].ToString())) { return(i); } } return(0); }
/// <summary> /// 中缀表达式转换为后缀表达式 /// </summary> /// <param name="alexpression"></param> /// <returns></returns> public static ArrayList ConvertToPostfix(ArrayList alexpression) { ArrayList alOutput = new ArrayList(); Stack sOperator = new Stack(); string word = null; int count = alexpression.Count; int i = 0; while (i < count) { word = alexpression[i++].ToString(); //·读到左括号时总是将它压入栈中 if (OperatorMap.CheckLeftBracket(word)) { sOperator.Push(word); } else //·读到右括号时,将*近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。 if (OperatorMap.CheckRightBracket(word)) { while (true) { if (sOperator.Count == 0) { break; } string sTop = sOperator.Peek().ToString(); if (sTop == "(") { sOperator.Pop(); break; } else { alOutput.Add(sOperator.Pop()); } } } else //·当读到数字直接送至输出队列中 if (OperatorMap.IsVar(word)) { alOutput.Add(word); } else //·当读到运算符t时, // a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中; // b.t进栈 if (OperatorMap.CheckOperator(word)) { while (sOperator.Count > 0) { string sPop = sOperator.Peek().ToString(); if (sPop == "(") { break; } if (OperatorMap.GetMaxprior(word, sPop) >= 0) { // sPop = sOperator.Pop().ToString(); alOutput.Add(sOperator.Pop().ToString()); } else { break; } // System.Console.WriteLine("XH{0}",sPop); } sOperator.Push(word); } // System.Console.WriteLine("{0}",word.ToString()); } //中缀表达式全部读完后,若栈中仍有运算符,将其送到输出队列中 while (sOperator.Count > 0) { string s = sOperator.Pop().ToString(); alOutput.Add(s); // System.Console.WriteLine("{0}:{1}",sOperator.Count,s.ToString()); } return(alOutput); }
public static ArrayList ConvertToPostfix(ArrayList alexpression) { ArrayList arrayList = new ArrayList(); Stack stack = new Stack(); int count = alexpression.Count; int i = 0; while (i < count) { string text = alexpression[i++].ToString(); if (OperatorMap.CheckLeftBracket(text)) { stack.Push(text); } else { if (OperatorMap.CheckRightBracket(text)) { while (stack.Count != 0) { string a = stack.Peek().ToString(); if (a == "(") { stack.Pop(); break; } arrayList.Add(stack.Pop()); } } else { if (OperatorMap.IsVar(text)) { arrayList.Add(text); } else { if (OperatorMap.CheckOperator(text)) { while (stack.Count > 0) { string text2 = stack.Peek().ToString(); if (text2 == "(" || OperatorMap.GetMaxprior(text, text2) < 0) { break; } arrayList.Add(stack.Pop().ToString()); } stack.Push(text); } } } } } while (stack.Count > 0) { string value = stack.Pop().ToString(); arrayList.Add(value); } return(arrayList); }