數據結構之應用 "棧(Stack)" 實現: 解析算術表達式及計算求值 (C#/Java)

  • 中綴表達式到後綴表達式的轉換要把表達式從中綴表達式的形式轉換成用後綴表示法
    表示的等價表達式

     

    C# Code:

     

    //using System;
    class Class1
    {
     public static void Main()
     {
      System.Console.WriteLine("Hello World!");
      //中綴 => 後綴表達式
      string s = "(  1.9   +  (20 +  41)    / (25 * 11) -     3          )              * 2"; //中綴; //中綴
      string S = ""; //後綴
      char[] Operators = new char[s.Length];
      int Top = -1;
      for (int i = 0; i < s.Length; i++)
      {
       char C = s[i];
       switch (C)
       {
        case ’ ’ : //忽略空格
         break;
        case ’+’ : //操作符
        case ’-’ :
         while (Top >= 0) //棧不爲空時
         {
          char c = Operators[Top--]; //pop Operator
          if (c == ’(’)
          {
           Operators[++Top] = c; //push Operator
           break;
          }
          else
          {
           S = S + c;
          }
         }
         Operators[++Top] = C; //push Operator
         S += " ";
         break;
        case ’*’ : //忽略空格
        case ’/’ :
         while (Top >= 0) //棧不爲空時
         {
          char c = Operators[Top--]; //pop Operator
          if (c == ’(’)
          {
           Operators[++Top] = c; //push Operator
           break;
          }
          else
          {
           if (c == ’+’ || c == ’-’)
           {
            Operators[++Top] = c; //push Operator
            break;
           }
           else
           {
            S = S + c;
           }
          }
         }
         Operators[++Top] = C; //push Operator
         S += " ";
         break;
        case ’(’ :
         Operators[++Top] = C;
         S += " ";
         break;
        case ’)’ :
         while (Top >= 0) //棧不爲空時
         {
          char c = Operators[Top--]; //pop Operator
          if (c == ’(’)
          {
           break;
          }
          else
          {
           S = S + c;
          }
         }
         S += " ";
         break;
        default :
         S = S + C;
         break;
        
       }
      }
      while (Top >= 0)
      {
       S = S + Operators[Top--]; //pop Operator
      }

     

      System.Console.WriteLine(S); //後綴

     

      //後綴表達式計算
      double[] Operands = new double[S.Length];
      double x, y, v;
      Top = - 1;
      string Operand = "";
      for (int i = 0; i < S.Length; i++)
      {
       char c = S[i];
       if ((c >= ’0’ && c <= ’9’) || c == ’.’)
       {
        Operand += c;
       }

     

       if ((c == ’ ’ && Operand != "") || i == S.Length - 1)
       {
        Operands[++Top] = System.Convert.ToDouble(Operand) ; //push Operands
        Operand = "";
       }

     

       if (c == ’+’ || c == ’-’ || c == ’*’ || c == ’/’)
       {
        if ((Operand != ""))
        {
         Operands[++Top] = System.Convert.ToDouble(Operand) ; //push Operands
         Operand = "";
        }
        y = Operands[Top--]; //pop 雙目運算符的第二操作數 (後進先出)注意操作數順序對除法的影響
        x = Operands[Top--]; //pop 雙目運算符的第一操作數
        switch (c)
        {
         case ’+’ :
          v = x + y;
          break;
         case ’-’ :
          v = x - y;
          break;
         case ’*’ :
          v = x * y;
          break;
         case ’/’ :
          v = x / y; // 第一操作數 / 第二操作數 注意操作數順序對除法的影響
          break;
         default :
          v = 0;
          break;
        }
        Operands[++Top] = v; //push 中間結果再次入棧
       }
      }
      v = Operands[Top--]; //pop 最終結果
      System.Console.WriteLine(v);
      System.Console.ReadLine();
     }
    }

     

     

     

    Java Code:

     

    class Class1
    {
     public static void main(String[] args) 
     {
      System.out.println("Hello World!");
      //中綴 => 後綴表達式
      String s = "(  1.9   +  (20 +  41)    / (25 * 11) -     3          )              * 2"; //中綴
      String S = ""; //後綴
      char[] Operators = new char[s.length()];
      int Top = -1;
      for (int i = 0; i < s.length(); i++)
      {
       char C = s.charAt(i);
       switch(C)
       {
        case ’ ’ :
         break;
        case ’+’ : //操作符
        case ’-’ :
         while (Top >= 0) //棧不爲空時
         {
          char c = Operators[Top--]; //pop Operator
          if (c == ’(’)
          {
           Operators[++Top] = c; //push Operator
           break;
          }
          else
          {
           S = S + c;
          }
         }
         Operators[++Top] = C; //push Operator
         S += " ";
         break;
        case ’*’ : //操作符
        case ’/’ :
         while (Top >= 0) //棧不爲空時
         {
          char c = Operators[Top--]; //pop Operator
          if (c == ’(’)
          {
           Operators[++Top] = c; //push Operator
           break;
          }
          else
          {
           if (c == ’+’ || c == ’-’)
           {
            Operators[++Top] = c; //push Operator
            break;
           }
           else
           {
            S = S + c;
           }
          }
         }
         Operators[++Top] = C; //push Operator
         S += " ";
         break;
        case ’(’ : //操作符
         Operators[++Top] = C;
         S += " ";
         break;
        case ’)’ : //操作符
         while (Top >= 0) //棧不爲空時
         {
          char c = Operators[Top--]; //pop Operator
          if (c == ’(’)
          {
           break;
          }
          else
          {
           S = S + c;
          }
         }
         S += " ";
         break;
        default : //操作數
         S = S + C;
         break;
       }
      }
      while (Top >= 0)
      {
       S = S + Operators[Top--]; //pop Operator
      }

     

      System.out.println(S); //後綴

     

      //後綴表達式計算
      double[] Operands = new double[S.length()];
      double x, y, v;
      Top = - 1;
      String Operand = "";
      for (int i = 0; i < S.length(); i++)
      {
       char c = S.charAt(i);
       if ((c >= ’0’ && c <= ’9’) || c == ’.’)
       {
        Operand += c;
       }

     

       if ((c == ’ ’ && Operand != "") || i == S.length() - 1)
       {
        Operands[++Top] = java.lang.Double.parseDouble(Operand) ; //push Operands
        Operand = "";
       }

     

       if (c == ’+’ || c == ’-’ || c == ’*’ || c == ’/’)
       {
        if ((Operand != ""))
        {
         Operands[++Top] = java.lang.Double.parseDouble(Operand) ; //push Operands
         Operand = "";
        }
        y = Operands[Top--]; //pop 雙目運算符的第二操作數 (後進先出)注意操作數順序對除法的影響
        x = Operands[Top--]; //pop 雙目運算符的第一操作數
        switch (c)
        {
         case ’+’ :
          v = x + y;
          break;
         case ’-’ :
          v = x - y;
          break;
         case ’*’ :
          v = x * y;
          break;
         case ’/’ :
          v = x / y; // 第一操作數 / 第二操作數 注意操作數順序對除法的影響
          break;
         default :
          v = 0;
          break;
        }
        Operands[++Top] = v; //push 中間結果再次入棧
       }
      }
      v = Operands[Top--]; //pop 最終結果
      System.out.println(v);
     }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章