对于算式转换成字符串的计算

字符串计算

1.需求分析

完成算式的计算,并可以支持多种运算符号。

2.整体思路

1.设计三个栈,一个是读取算式的栈,一个是用来存储数字的栈,一个是用来存储字符的。
2.计算的思想就是有括号先算括号里面的,没有括号的,当符号的优先级小于或者等于存储字符的栈的top的时候就加入栈,不然就运算。

3、代码实现

package com.instance;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CalculateI {
int i = 1;//表示符号的状态
static HashMap<String,Integer> temp = new HashMap<String,Integer>();
public CalculateI(){
temp.put("(",0);
temp.put(")",3);
temp.put("-",1);
temp.put("+",1);
temp.put("*",2);
temp.put("/",2);
}

public String returnCalculate(String formula) {
    MyStack myStack = new MyStack();//储存操作字符和数字
    MyStack numStack = new MyStack();//操作数字
    MyStack charStack = new MyStack();//操作字符

    char[] array = formula.toCharArray();
    for(int i=formula.length()-1;i>=0;i--){
        myStack.push(String.valueOf(array[i]));


    }
    String temp1 = "";//注意读入数字的时候一定要使用getNext函数
    temp1 = myStack.getNext();
    if(myStack.isNum(temp1)){

        numStack.push(temp1);
        temp1 = myStack.getNext();
        charStack.push(temp1);
    }else{

        charStack.push(temp1);
        temp1 = myStack.getNext();
        numStack.push(temp1);
    }

    while(!myStack.isEmpty()||!charStack.isEmpty()){
        if(myStack.isEmpty()){//读入的栈里面没有数值
            while (!charStack.isEmpty()) {
                String result = result(numStack.pop(), numStack.pop(), charStack.pop());
                numStack.push(result);

            }
        }


        temp1 = myStack.getNext();



        if(temp1!=null){
            if(myStack.isNum(temp1)){
                numStack.push(temp1);


            }else if(charStack.isEmpty()){//为了后面如果字符栈为空取出字符会出错。
                charStack.push(temp1);

            }else if(temp1.equals("(")){
                charStack.push(temp1);

            }else if(temp1.equals(")")){

                while(!charStack.peek().equals("(")){

                    String result = result(numStack.pop(), numStack.pop(), charStack.pop());
                    numStack.push(result);

                }

                charStack.pop();//为了排除(

            }else if(temp.get(temp1)>=temp.get(charStack.peek())){


                charStack.push(temp1);
            }else if(temp.get(temp1)<temp.get(charStack.peek())){
                while (temp.get(temp1)<temp.get(charStack.peek())&&!charStack.isEmpty()){
                    String result = result(numStack.pop(), numStack.pop(), charStack.pop());
                    numStack.push(result);

                }
                charStack.push(temp1);

            }

        }
        }


    return numStack.pop();
}

static  String result(String num,String num2,String charOr){
    switch (charOr){
        case "+":return Double.toString(Double.parseDouble(num2)+Double.parseDouble(num));//数字栈是后面先加入的数字先输出
        case "-":return Double.toString(Double.parseDouble(num2)-Double.parseDouble(num));
        case "*":return Double.toString(Double.parseDouble(num2)*Double.parseDouble(num));
        case "/":
            return Double.toString(Double.parseDouble(num2)/Double.parseDouble(num));
    }
    return null;

}
  class MyStack extends Stack<String>{//为了返回一个连串的数字
    String getNext(){
        if(!this.isEmpty()){
            String temp = "";
            if(isNum(this.peek())){

                while (!(this.isEmpty())&&isNum(this.peek())){//这两个的判断条件一定不能乱,不然当栈为null的时候还会执行peek
                    temp += this.pop();
                }
                return temp;
            }
            return this.pop();//返回的是单个字符
        }
        return null;
    }

    boolean isNum(String a){
        for(int i=0;i<a.length();i++){
            if(!Character.isDigit(a.charAt(i))&&!(a.charAt(i)=='.') ){
                return false;
            }
        }
        return true;

    }


}

}

猜你喜欢

转载自blog.csdn.net/qq_44688861/article/details/105018191
今日推荐