美文网首页
计算器JAVA代码 ,双栈写法

计算器JAVA代码 ,双栈写法

作者: 小明同学机器人 | 来源:发表于2021-10-11 21:22 被阅读0次

计算器代码 ,双栈写法 ,具体内容看注释

package com.zy.demo;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;

/**
 * Copyright:www.zhaoyang.wicp.vip
 * Author:王昭阳 -小明机器人
 * Date:2021/10/11
 * Description:代码版权声明
 * 这是一个全能计算器代码
 * 具体思路如下
 * 1.建立两个栈,分别是 数字栈 和符号栈
 * 2.从左到有依次遍历表达式
 * 3.如果遇到数字,将数字入数字栈
 * 4.如果遇到符号,分两种情况,若符号栈为空,该符号直接入符号栈
 * 5.若符号栈不为空--继续判断该符号的优先级是否小于或等于该栈顶符号优先级,
 * 如果是,则出栈符号栈顶元素,再出栈两次数字栈元素,进行运算(最后出栈的数字放前面),运算出来的结果放入数字栈,然后再5操作一次
 * 如果不是,符号直接入符号栈
 * 6.最后数字栈剩下最后一个数字,就是结果
 */
public class MainCircleClient {

    private static Stack<Double> numList;
    private static Stack<String> charList;

    public static void main(String[] args) {
//        String circleString = "7*2+4+2*4-3";
        ArrayList<String> circleList = new ArrayList<>();
        circleList.add("7");
        circleList.add("-");
        circleList.add("2");
        circleList.add("/");
        circleList.add("4");
        circleList.add("+");
        circleList.add("3");
        numList = new Stack<>();
        charList = new Stack<>();

        for (int i = 0; i < circleList.size(); i++) {
            String s = circleList.get(i);
            if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
                if (charList.isEmpty() || getPor(s) > getPor(charList.peek())) {
                    charList.push(s);
                } else if (getPor(s) <= getPor(charList.peek())) {
                    opera();
                    if (getPor(s) <= getPor(charList.peek())) {
                        opera();//防止运算后栈顶的第二个元素也符合判断条件,所以必须再执行一次
                    }
                    charList.push(s);
                }
            } else {
                numList.push(Double.parseDouble(s));
            }
        }
        while (numList.size() > 1) {
            opera();

        }

        Double peek = numList.peek();
        System.out.println(peek + "结果");


    }

    public static void opera() {
        Double second = numList.pop();
        Double first = numList.pop();
        String pop = charList.pop();
        double answer = getAnswer(first, second, pop);
        numList.push(answer);
    }

    public static int getPor(String opera) {

        int por = 0;
        if (opera.equals("+")) {
            por = 0;
        }
        if (opera.equals("-")) {
            por = 0;
        }
        if (opera.equals("*")) {
            System.out.println("*****");
            por = 3;
        }
        if (opera.equals("/")) {


            por = 3;
        }
        return por;

    }

    public static double getAnswer(double a, double b, String c) {
        double answer = 0;
        if (c.equals("+")) {
            answer = a + b;
        } else if (c.equals("-")) {
            answer = a - b;
        } else if (c.equals("*")) {
            answer = a * b;
        } else if (c.equals("/")) {
            answer = a / b;
        }
        return answer;

    }

}


相关文章

网友评论

      本文标题:计算器JAVA代码 ,双栈写法

      本文链接:https://www.haomeiwen.com/subject/cwjroltx.html