⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.java

📁 Java程序设计技巧与开发实例附书源代码。
💻 JAVA
字号:

public class Calculator
{
   private static Queue tokens = null;

   protected static double evaluatePostfix(Queue postfix) throws
       TokenException
   {
      Stack numbers = new Stack();
      try
      {
         while (!postfix.isEmpty())
         {
            Object token = postfix.dequeue();
            if (token instanceof TokenOperator)
            {
               TokenNumeric n1 = (TokenNumeric) numbers.pop();
               TokenNumeric n2 = (TokenNumeric) numbers.pop();
               TokenOperator op = (TokenOperator) token;
               numbers.push(op.evaluate(n1.getNumber(), n2.getNumber()));
            }
            else
            {
               numbers.push(token);
            }
         }
         TokenNumeric answer = (TokenNumeric) numbers.pop();
         if (numbers.isEmpty())
         {
            return answer.getNumber();
         }
         else
         {
            throw new TokenException("invalid expression");
         }
      }
      catch (StackException se)
      {
         throw new TokenException("invalid expression");
      }
      catch (QueueException qe)
      {
         throw new TokenException("unknown error");
      }

   }

   protected static Queue toPostfix(Queue infix) throws TokenException
   {
      Stack stack = new Stack();
      Queue postfix = new Queue();
      try
      {
         while (!infix.isEmpty())
         {
            Object token = infix.dequeue();
            if (token instanceof TokenNumeric)
            {
               postfix.enqueue(token);
            }
            else
            {
               TokenOperator op = (TokenOperator) token;
               if (op.isOpenParen())
               {
                  stack.push(op);
               }
               else if (op.isCloseParen())
               {
                  while (! ( (TokenOperator) stack.peek()).isOpenParen())
                  {
                     postfix.enqueue(stack.pop());
                  }
                  Object dummy = stack.pop();
               }
               else if (stack.isEmpty())
               {
                  stack.push(op);
               }
               else if ( ( (TokenOperator) stack.peek()).order() <
                        op.order())
               {
                  stack.push(op);
               }
               else
               {
                  while ( (!stack.isEmpty()) &&
                         ( ( (TokenOperator) stack.peek()).order() >=
                          op.order()))
                  {
                     postfix.enqueue(stack.pop());
                  }
                  stack.push(op);
               }
            }
         }
         while (!stack.isEmpty())
         {
            if (! ( (TokenOperator) stack.peek()).isOpenParen())
            {
               postfix.enqueue(stack.pop());
            }
            else
            {
               throw new TokenException("unmatched bracket");
            }
         }
         return postfix;
      }
      catch (StackException se)
      {
         throw new TokenException("unmatched bracket or invalid input");
      }
      catch (QueueException qe)
      {
         throw new TokenException("unknown exception");
      }

   }

   protected static Queue tokenize(String input) throws TokenException
   {
      Queue Q = new Queue();
      String token = new String("");
      for (int i = 0; i < input.length(); i++)
      {
         char cc = input.charAt(i);
         if (!TokenOperator.isValidOp(cc))
         {
            token += cc;
         }
         else
         {
            if (!token.trim().equals(""))
            {
               Q.enqueue(new TokenNumeric(token.trim()));
            }
            Character operator = new Character(cc);
            Q.enqueue(new TokenOperator(operator.toString()));
            token = new String("");
         }
      }
      if (!token.trim().equals(""))
      {
         Q.enqueue(new TokenNumeric(token.trim()));
      }
      return Q;
   }

   public static void main(String args[])
   {
      String prompt = "Calc [q to quit] => ";
      String input = "";
      while (!input.equalsIgnoreCase("q"))
      {
         if (!input.equals(""))
         {
            try
            {
               double ans = evaluatePostfix(toPostfix(tokenize(input)));
               System.out.println(prompt + input + " = " + ans);
            }
            catch (TokenException te)
            {
               System.err.println(te);
            }
         }
         System.out.print(prompt);
         input = Console.readString();
      }
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -