📄 calculator.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 + -