Java的逆波兰式算法

java 代码
  package expression;

  import java.io.*;

  import java.util.*;

  public class Expression {

  private ArrayList expression = new ArrayList();// 存储中序表达式

  private ArrayList right = new ArrayList();// 存储右序表达式

  private String result;// 结果

  // 依据输入信息创建对象,将数值与操作符放入ArrayList中

  private Expression(String input) {

  StringTokenizer st = new StringTokenizer(input, "+-*/()", true);

  while (st.hasMoreElements()) {

  expression.add(st.nextToken());

  }

  }

  // 将中序表达式转换为右序表达式

  private void toRight() {

  Stacks aStack = new Stacks();

  String operator;

  int position = 0;

  while (true) {

  if (Calculate.isOperator((String) expression.get(position))) {

  if (aStack.top == -1

  || ((String) expression.get(position)).equals("(")) {

  aStack.push(expression.get(position));

  } else {

  if (((String) expression.get(position)).equals(")")) {

  if (!((String) aStack.top()).equals("(")) {

  operator = (String) aStack.pop();

  right.add(operator);

  }

  } else {

  if (Calculate.priority((String) expression

  .get(position)) <= Calculate

  .priority((String) aStack.top())

  && aStack.top != -1) {

  operator = (String) aStack.pop();

  if (!operator.equals("("))

  right.add(operator);

  }

  aStack.push(expression.get(position));

  }

  }

  } else

  right.add(expression.get(position));

  position++;

  if (position >= expression.size())

  break;

  }

  while (aStack.top != -1) {

  operator = (String) aStack.pop();

  right.add(operator);

  }

  }

  // 对右序表达式进行求值

  private void getResult() {

  this.toRight();

  Stacks aStack = new Stacks();

  String op1, op2, is = null;

  Iterator it = right.iterator();

  while (it.hasNext()) {

  is = (String) it.next();

  if (Calculate.isOperator(is)) {

  op1 = (String) aStack.pop();

  op2 = (String) aStack.pop();

  aStack.push(Calculate.twoResult(is, op1, op2));

  } else

  aStack.push(is);

  }

  result = (String) aStack.pop();

  it = expression.iterator();

  while (it.hasNext()) {

  System.out.print((String) it.next());

  }

  System.out.println("=" + result);

  }

  public static void main(String avg[]) {

  try {

  System.out.println("Input a expression:");

  BufferedReader is = new BufferedReader(new InputStreamReader(

  System.in));

  for (;;) {

  String input = new String();

  input = is.readLine().trim();

  if (input.equals("q"))

  break;

  else {

  Expression boya = new Expression(input);

  boya.getResult();

  }

  System.out

  .println("Input another expression or input 'q' to quit:");

  }

  is.close();

  } catch (IOException e) {

  System.out.println("Wrong input!!!");

  }

  }

  }


本文转自 ☆★ 包罗万象 ★☆ - http://www.baoluowanxiang.com 转载请注明出处,侵权必究!
原文链接:http://www.baoluowanxiang.com/a/program/java/2010/0528/906.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值