java 波兰式_java的逆波兰式算法

本文介绍了一个Java程序,通过中序遍历和栈操作,将输入的数学表达式转换为右序,并进行求值。核心包括Expression类的实现,如isOperator和priority方法,以及toRight和getResult函数。适合理解表达式处理和基本算法的读者。
摘要由CSDN通过智能技术生成

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!!!");

}

}

}

java 代码

package expression;

public class Calculate {

// 判断是否为操作符号

public static boolean isOperator(String operator) {

if (operator.equals("+") || operator.equals("-")

|| operator.equals("*") || operator.equals("/")

|| operator.equals("(") || operator.equals(")"))

return true;

else

return false;

}

// 设置操作符号的优先级别

public static int priority(String operator) {

if (operator.equals("+") || operator.equals("-")

|| operator.equals("("))

return 1;

else if (operator.equals("*") || operator.equals("/"))

return 2;

else

return 0;

}

// 做2值之间的计算

public static String twoResult(String operator, String a, String b) {

try {

String op = operator;

String rs = new String();

double x = Double.parseDouble(b);

double y = Double.parseDouble(a);

double z = 0;

if (op.equals("+"))

z = x + y;

else if (op.equals("-"))

z = x - y;

else if (op.equals("*"))

z = x * y;

else if (op.equals("/"))

z = x / y;

else

z = 0;

return rs + z;

} catch (NumberFormatException e) {

System.out.println("input has something wrong!");

return "Error";

}

}

}

java 代码package expression;     import java.util.*;     //栈类     public class Stacks{        private LinkedList list=new LinkedList();        int top=-1;        public void push(Object value){           top++;           list.addFirst(value);        }        public Object pop(){           Object temp=list.getFirst();           top--;           list.removeFirst();           return temp;           }        public Object top(){        return list.getFirst();        }     }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值