zoukankan      html  css  js  c++  java
  • 数据结构之应用 "栈(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 == ' ' || 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);
     }
    }

  • 相关阅读:
    什么是先进先出淘汰算法,试举出一种实现方法?
    什么是置换算法,在页式系统中常用的置换算法是什么?
    什么是系统的抖动,它有什么危害?
    如果主存中的某页正在与外部设备交换信息,缺页中断时可以将这一页淘汰吗?为了实现正确的页面调度,应如何扩充页表的功能?
    什么是虚拟存储器,在页式系统中如何实现虚拟存储?
    分区分配方法的主要缺点是什么,如何克服这一缺点?
    什么是最坏适应算法?该算法的特点是什么?
    什么是最佳适应算法,该算法的特点是什么?
    JAVA8 之初识函数式编程与函数式接口(一)
    使用 Netty 实现一个 MVC 框架
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485754.html
Copyright © 2011-2022 走看看