資料結構之應用 “棧(Stack)” 實現: 解析算術運算式及計算求值 (C#/Java)

來源:互聯網
上載者:User

中綴運算式到尾碼運算式的轉換要把運算式從中綴運算式的形式轉換成用尾碼標記法
表示的等價運算式

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 == ' ' || i == S.Length - 1) && Operand != "") //Update
   {
    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 == ' ' || i == S.length() - 1) && Operand != "") //Update
   {
    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);
 }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.