convertisseur infixe en postfixe

J’ai travaillé sur cet infixe au convertisseur de notation postfixe / polis. Bien que je ne pense pas que la solution soit adéquate. Plus précisément, la variable j (EDIT: maintenant appelée index) me perturbe.

Avez-vous des suggestions? Ou peut-être y a-t-il une bien meilleure façon de l’accomplir? Ou est-ce que je m’inquiète trop?

public static ssortingng[] InfixToPostfix(ssortingng[] infixArray) { var stack = new Stack(); var postfix = new ssortingng[infixArray.Length]; int index = 0; ssortingng st; for (int i = 0; i  0) { st = stack.Pop(); if (RegnePrioritet(st) >= RegnePrioritet(infixArray[i])) { postfix[index] = st; index++; } else { stack.Push(st); break; } } stack.Push(infixArray[i]); } } } while (stack.Count > 0) { postfix[index] = stack.Pop(); index++; } return postfix.TakeWhile(item => item != null).ToArray(); } 

Si vous remplacez array par une Stack , vous n’avez pas à suivre où vous en êtes avec la variable d’ index .

Vous pouvez alors retourner votre résultat avec postfixStack.ToArray()

Ma mise en oeuvre:

 public static ssortingng[] InfixToPostfix( ssortingng[] infixArray ) { var stack = new Stack(); var postfix = new Stack(); ssortingng st; for ( int i = 0 ; i < infixArray.Length ; i++ ) { if ( !( "()*/+-".Contains( infixArray[ i ] ) ) ) { postfix.Push(infixArray[i]); } else { if ( infixArray[ i ].Equals( "(" ) ) { stack.Push( "(" ); } else if ( infixArray[ i ].Equals( ")" ) ) { st = stack.Pop(); while ( !( st.Equals( "(" ) ) ) { postfix.Push( st ); st = stack.Pop(); } } else { while ( stack.Count > 0 ) { st = stack.Pop(); if ( RegnePrioritet( st ) >= RegnePrioritet( infixArray[ i ] ) ) { postfix.Push(st); } else { stack.Push( st ); break; } } stack.Push( infixArray[ i ] ); } } } while ( stack.Count > 0 ) { postfix.Push(stack.Pop()); } return postfix.Reverse().ToArray(); } 

Voici une implémentation très basique (chiffres, parenthèses et opérateurs + – / * uniquement) des informations sur Wikipedia portant sur infixe, postfixe et l’algorithme Shunting Yard. Pourrait être amélioré et amélioré, ce que je ferai pour mon propre travail, mais je poste ici avant de le personnaliser au-delà de toute reconnaissance:

 using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; namespace Infix_to_Postfix { #region enums enum TokenTypes { Operator, Number, Parenthesis } enum Associativenesses { Left, Right } enum OperatorTypes { Plus, Minus, Multiply, Divide, Equals, Exclamation, Modulus } enum ParenthesisTypes { Open, Close } #endregion #region classes public class Token { } class Operator : Token { public OperatorTypes OperatorType { get; set; } public Operator(OperatorTypes operatorType) { OperatorType = operatorType; } public int Precedence { get { switch (this.OperatorType) { case OperatorTypes.Exclamation: return 4; case OperatorTypes.Multiply: case OperatorTypes.Divide: case OperatorTypes.Modulus: return 3; case OperatorTypes.Plus: case OperatorTypes.Minus: return 2; case OperatorTypes.Equals: return 1; default: throw new Exception("Invalid Operator Type for Precedence get"); } } } public Associativenesses Associativeness { get { switch (this.OperatorType) { case OperatorTypes.Equals: case OperatorTypes.Exclamation: return Associativenesses.Right; case OperatorTypes.Plus: case OperatorTypes.Minus: case OperatorTypes.Multiply: case OperatorTypes.Divide: case OperatorTypes.Modulus: return Associativenesses.Left; default: throw new Exception("Invalid Operator Type for Associativeness get"); } } } public override ssortingng ToSsortingng() { switch (OperatorType) { case OperatorTypes.Plus: return "+"; case OperatorTypes.Minus: return "-"; case OperatorTypes.Multiply: return "*"; case OperatorTypes.Divide: return "/"; case OperatorTypes.Equals: return "="; case OperatorTypes.Exclamation: return "!"; case OperatorTypes.Modulus: return "%"; default: return null; } } public static OperatorTypes? GetOperatorType(ssortingng operatorValue) { switch (operatorValue) { case "+": return OperatorTypes.Plus; case "-": return OperatorTypes.Minus; case "*": return OperatorTypes.Multiply; case "/": return OperatorTypes.Divide; case "=": return OperatorTypes.Equals; case "!": return OperatorTypes.Exclamation; case "%": return OperatorTypes.Modulus; default: return null; } } } class Parenthesis : Token { public ParenthesisTypes ParenthesisType { get; set; } public Parenthesis(ParenthesisTypes parenthesisType) { ParenthesisType = parenthesisType; } public override ssortingng ToSsortingng() { if (ParenthesisType == ParenthesisTypes.Open) return "("; else return ")"; } public static ParenthesisTypes? GetParenthesisType(ssortingng parenthesisValue) { switch (parenthesisValue) { case "(": return ParenthesisTypes.Open; case ")": return ParenthesisTypes.Close; default: return null; } } } class Numeric : Token { public decimal Value { get; set; } public Numeric(decimal value) { Value = value; } public override ssortingng ToSsortingng() { return Value.ToSsortingng(); } } public class Formula { public Stack InfixTokens { get; set; } public Stack PostfixTokens { get; set; } public ssortingng RawFormula { get; set; } public Formula(ssortingng rawFormula) { // store the raw formula RawFormula = rawFormula; InfixTokens = new Stack(); PostfixTokens = new Stack(); #region generate the InFix Stack Stack tokens = new Stack(); ssortingng store = ""; // parse the formula into a stack of tokens while (rawFormula.Length > 0) { ssortingng ThisChar = rawFormula.Subssortingng(0, 1); if (Regex.IsMatch(ThisChar, "[0-9\\.]")) { // a numeric char, so store it until the number is reached store += ThisChar; } else if (Operator.GetOperatorType(ThisChar) != null) { // a value is stored, so add it to the stack before processing the operator if (store != "") { tokens.Push(new Numeric(Convert.ToDecimal(store))); store = ""; } tokens.Push(new Operator((OperatorTypes)Operator.GetOperatorType(ThisChar))); } else if (Parenthesis.GetParenthesisType(ThisChar)!=null) { // a value is stored, so add it to the stack before processing the parenthesis if (store != "") { tokens.Push(new Numeric(Convert.ToDecimal(store))); store = ""; } tokens.Push(new Parenthesis((ParenthesisTypes)Parenthesis.GetParenthesisType(ThisChar))); } else { // ignore blanks (unless between to numbers) if (!(ThisChar == " " && !(store != "" && Regex.IsMatch(rawFormula.Subssortingng(1, 1), "[0-9\\.]")))) { throw new Exception("Invalid character in Formula: " + ThisChar); } } // move to the next position rawFormula = rawFormula.Subssortingng(1); } // if there is still something in the numeric store, add it to the stack if (store != "") { tokens.Push(new Numeric(Convert.ToDecimal(store))); } // reverse the stack Stack reversedStack = new Stack(); while (tokens.Count > 0) reversedStack.Push(tokens.Pop()); // store in the Tokens property InfixTokens = reversedStack; #endregion #region generate the PostFix Stack // get a reversed copy of the tokens Stack infixTokens = new Stack(InfixTokens); Stack InFixStack = new Stack(); while (infixTokens.Count > 0) InFixStack.Push(infixTokens.Pop()); // new stacks Stack output = new Stack(); Stack operators = new Stack(); while (InFixStack.Count > 0) { Token currentToken = InFixStack.Pop(); // if it's an operator if (currentToken.GetType() == typeof(Operator)) { // move precedent operators to output while (operators.Count > 0 && operators.Peek().GetType() == typeof(Operator)) { Operator currentOperator = (Operator)currentToken; Operator nextOperator = (Operator)operators.Peek(); if ((currentOperator.Associativeness == Associativenesses.Left && currentOperator.Precedence <= nextOperator.Precedence) || (currentOperator.Associativeness == Associativenesses.Right && currentOperator.Precedence < nextOperator.Precedence)) { output.Push(operators.Pop()); } else { break; } } // add to operators operators.Push(currentToken); } // if it's a bracket else if (currentToken.GetType() == typeof(Parenthesis)) { switch (((Parenthesis)currentToken).ParenthesisType) { // if it's an opening bracket, add it to operators case ParenthesisTypes.Open: operators.Push(currentToken); break; // if it's a closing bracket case ParenthesisTypes.Close: // shift operators in between opening to output while (operators.Count > 0) { Token nextOperator = operators.Peek(); if (nextOperator.GetType() == typeof(Parenthesis) && ((Parenthesis)nextOperator).ParenthesisType == ParenthesisTypes.Open) break; output.Push(operators.Pop()); } // add to operators operators.Pop(); break; } } // if it's numeric, add to output else if (currentToken.GetType() == typeof(Numeric)) { output.Push(currentToken); } } // for all remaining operators, move to output while (operators.Count > 0) { output.Push(operators.Pop()); } // reverse the stack reversedStack = new Stack(); while (output.Count > 0) reversedStack.Push(output.Pop()); // store in the Tokens property PostfixTokens = reversedStack; #endregion } public decimal Calculate() { Stack EvaluationStack = new Stack(); // get a reversed copy of the tokens Stack postFixStack = new Stack(PostfixTokens); Stack PostFixStack = new Stack(); while (postFixStack.Count > 0) PostFixStack.Push(postFixStack.Pop()); while (PostFixStack.Count > 0) { Token currentToken = PostFixStack.Pop(); if (currentToken.GetType() == typeof(Numeric)) { EvaluationStack.Push((Numeric)currentToken); } else if (currentToken.GetType() == typeof(Operator)) { Operator currentOperator = (Operator)currentToken; if (currentOperator.OperatorType == OperatorTypes.Plus || currentOperator.OperatorType == OperatorTypes.Minus || currentOperator.OperatorType == OperatorTypes.Multiply || currentOperator.OperatorType == OperatorTypes.Divide) { decimal FirstValue = EvaluationStack.Pop().Value; decimal SecondValue = EvaluationStack.Pop().Value; decimal Result; if (currentOperator.OperatorType == OperatorTypes.Plus) { Result = SecondValue + FirstValue; } else if (currentOperator.OperatorType == OperatorTypes.Minus) { Result = SecondValue - FirstValue; } else if (currentOperator.OperatorType == OperatorTypes.Divide) { Result = SecondValue / FirstValue; } else if (currentOperator.OperatorType == OperatorTypes.Multiply) { Result = SecondValue * FirstValue; } else { throw new Exception("Unhandled operator in Formula.Calculate()"); } EvaluationStack.Push(new Numeric(Result)); Console.WriteLine("EVAL: " + SecondValue.ToSsortingng() + " " + currentOperator.ToSsortingng() + " " + FirstValue.ToSsortingng() + " = " + Result.ToSsortingng()); } } else { throw new Exception("Unexpected Token type in Formula.Calculate"); } } if (EvaluationStack.Count != 1) { throw new Exception("Unexpected number of Tokens in Formula.Calculate"); } return EvaluationStack.Peek().Value; } } #endregion class Program { static void Main(ssortingng[] args) { try { ssortingng Equation = ""; Equation = "1+2+3"; Equation = "(((12.7+2)/3)-10)*(32+(3*5))"; Equation = "5 + ((1 + 2) * 4) - 3"; Equation = "1 + (3 * 4) - 3"; Equation = "5+8-(2*2)"; Equation = "10/2+3/2*4-2+4*3/4-9"; Equation = "6/2*4"; Equation = "3 + 4 * 2 / ( 1 - 5 ) "; Console.WriteLine("EQUATION: " + Equation); Formula formula = new Formula(Equation); Console.WriteLine("INFIX: " + Ssortingng.Join(" ", formula.InfixTokens)); Console.WriteLine("POSTFIX: " + Ssortingng.Join(" ", formula.PostfixTokens)); decimal Result = formula.Calculate(); Console.WriteLine("RESULT: " + Result.ToSsortingng()); } catch (Exception Err) { Console.WriteLine("ERROR: " + Err.Message); } Console.ReadLine(); } } } 

Essaye ça. Cela me prend un certain temps pour coder ceci mais cela fonctionne pour tous les exemples que j’ai trouvés sur Internet

 public void evaluate(Stack stk){ Stack output= new Stack(); Stack operators= new Stack(); while(!stk.isEmpty()){ Ssortingng str = stk.get(0).toSsortingng(); str = str.replace("\\s", ""); stk.removeElementAt(0); if(isNumerical(str)){ output.push(str); } else if(!isNumerical(str)){ char c = str.charAt(0); System.out.println(c); if(c=='('){ operators.push(c); } else if(c==')'){ char x= operators.pop().toSsortingng().charAt(0); while(x!='('){ System.out.println("That line excecuted and removed the char "+x); output.push(x); x=operators.pop().toSsortingng().charAt(0); } } else if(!output.isEmpty() && !operators.isEmpty()){ System.out.println("Printme"); char s= operators.lastElement().toSsortingng().charAt(0); System.out.println(s); System.out.println(c); if(precedenceNum(s)>=precedenceNum(c)){ Ssortingng op =operators.pop().toSsortingng(); output.push(op); operators.push(str); } else{ operators.push(str); } } else if(operators.isEmpty()){ operators.push(str); } System.out.println(operators); } } while(!operators.isEmpty()){ output.push(operators.pop()); } System.out.println(output); } 
 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace infix_to_postfix { class Program { static void Main(ssortingng[] args) { int i = new int(); Console.WriteLine("Enter the length of notation:"); //bool extra = new bool(); //do { // try // { i = Convert.ToInt32(Console.ReadLine()); //enter the length of notation //} //catch //{ //Console.WriteLine("Please Get Out"); // extra = false; // } //} while (extra== false); ssortingng[] infix = new ssortingng[i]; ssortingng[] postfix = new ssortingng[i]; ssortingng[] temp = new ssortingng[i]; Console.WriteLine("Enter values"); int l = 0; for ( l = 0; l < i; l++) { infix[l] = Console.ReadLine(); } int x = 0; Console.Write("Infix:"); for ( x = 0; x < i; x++) { Console.Write( infix[x]); } // removing paranthesis for(int z=i-1;z>=0;z--) { int c = z; if (infix[z] == "(") { infix[z] = null; } if (infix[z] == "+" || infix[z] == "*" || infix[z] == "/" || infix[z] == "-") { do { c++; if (infix[c] == ")") { infix[c] = infix[z]; infix[z] = null; break; } } while (c < i) ; } } //filling up int lagao = 0; for(int v=0;v