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

 

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用以下步骤来实现基于C#的简单波兰计算器: 1. 创建一个接受用户输入表达的文本框和一个按钮来触发计算。 2. 当用户按下按钮时,获取文本框中的表达。 3. 将表达转换为波兰(后缀表达)。 4. 使用堆栈来计算波兰表达。 5. 显示计算结果。 以下是一个基本的C#代码示例: ```csharp using System; using System.Collections.Generic; namespace Calculator { class Program { static void Main(string[] args) { Console.WriteLine("Enter an expression in reverse Polish notation:"); string input = Console.ReadLine(); // Convert the input expression to a list of tokens List<string> tokens = new List<string>(input.Split()); // Create a stack to store operands Stack<double> stack = new Stack<double>(); foreach (string token in tokens) { double operand; if (double.TryParse(token, out operand)) { // If the token is a number, push it onto the stack stack.Push(operand); } else { // If the token is an operator, pop two operands from the stack and apply the operator double operand2 = stack.Pop(); double operand1 = stack.Pop(); double result = 0; switch (token) { case "+": result = operand1 + operand2; break; case "-": result = operand1 - operand2; break; case "*": result = operand1 * operand2; break; case "/": result = operand1 / operand2; break; default: Console.WriteLine("Invalid operator: " + token); return; } // Push the result back onto the stack stack.Push(result); } } // The final result is on the top of the stack Console.WriteLine("Result: " + stack.Pop()); } } } ``` 这个示例程序将用户输入的表达转换为波兰,然后使用堆栈来计算表达的值。你可以根据自己的需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值