开发者社区> 田埂、> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java利用栈实现简单计算器功能

简介: 利用栈,如何能够实现计算器的功能,可以利用栈“先进先出”的特点。
+关注继续查看

利用栈,实现简单计算器功能

计算的数中 不能带括号.每行代码的功能,里面都备注的很清楚了
import java.util.Stack;
public class Calculator {
    public static void main(String[] args) {
        String s = "143+42+12*70-21+50";
        Stack<Character> operStack = new Stack<>();
        Stack<Integer> numStack = new Stack<>();
        int index = 0;
        String num = "";
        int num1, num2;
        while (true) {
            //利用循环一次一次的  从字符串中取
            char c = s.charAt(index);
            if (isOper(c)) {
                //如果c是运算符的话,执行这里
                if (operStack.isEmpty()) {
                    //判断运算符栈是否为空,为空的话直接把运算符加进去就好
                    operStack.push(c);
                } else {
                    //如果是运算符判断运算符的优先级
                    if (priority(c) <= priority(operStack.peek())) {
                        //如果该运算符  的优先级  小于或等于  栈顶元素的优先级
                        //取出两个数字栈中的数据  和 一个运算符栈中的数据  进行运算
                        //让后将运算结果 加入到数字栈中,将这个运算符加入到运算符栈中
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        numStack.push(cal(num1, num2, operStack.pop()));
                        operStack.push(c);
                    } else {
                        operStack.push(c);
                    }
                }
            } else {
                //如果c不是运算符的话执行这里
                num += c;
                //如果是多位数的话,需要判断数的位数
                if (index == s.length() - 1) {
                    numStack.push(Integer.parseInt(num));
                    num = "";
                } else {
                    //判断这个数字的下一个是不是 字符,如果是就把前面的字符 就把前面的数字加入到数字栈中
                    if (isOper(s.charAt(index + 1))) {
                        numStack.push(Integer.parseInt(num));
                        num = "";
                    }
                }
            }

            index++;
            if (index >= s.length()) {
                break;
            }
        }

        //将所有的 字符都入栈之后,进行计算
        //运算结束的条件(满足其中之一就可以)
        //1.数字栈中只剩下一个数字
        //2.运算符栈中没有运算符
        while (!operStack.isEmpty()) {
            num1 = numStack.pop();

            num2 = numStack.pop();
            numStack.push(cal(num1, num2, operStack.pop()));
        }
        System.out.printf("%s的运算结果为:%d", s, numStack.pop());
    }

    //判断是不是运算符
    static boolean isOper(char c) {
        if (c == '+' || c == '-' || c == '*' || c == '/' || c == 'x') {
            return true;
        }
        return false;
    }

    //判断运算符的优先级
    static int priority(char c) {
        if (c == '*' || c == '/' || c == 'x') {
            return 1;
        } else if (c == '+' || c == '-') {
            return 0;
        } else {
            return -1;
        }
    }

    //算数运算
    static int cal(int x, int y, char oper) {
        switch (oper) {
            case '+':
                return x + y;
            case '-':
                return y - x;
            case '*':
            case 'x':
                return x * y;
            case '/':
                return y / x;
            default:
                return -1;
        }
    }
}

如果想看更复杂的计算器,请看我的其它文章.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java数据结构--栈
Java数据结构--栈
0 0
java存储机制(堆、栈、方法区)
java存储机制(堆、栈、方法区)
0 0
使用栈解决分隔符匹配问题(java实现)
编写判断Java语句中分隔符是否匹配的问题。
0 0
java栈实现--链栈
线性表和栈都是我们常用的数据结构,栈可以看成一种特殊状态的线性表,栈的实现,一般都是使用线性表来实现,线性表分为顺序表和链表,使用线性表中的顺序表来实现栈时这种栈被称为顺序栈,相应的使用线性表中的链表来实现栈时这种栈被称为链栈,但是需要说明的是,虽然栈是一种特殊的线性表,但是栈和线性表并不是一种数据结构。这篇文章总结如何使用链式存储结构来实现栈,也就是链栈的实现。如果想要了解另一种栈(顺序栈)的实现请看这里:顺序栈的实现
0 0
java栈实现--顺序栈
线性表和栈都是我们常用的数据结构,栈可以看成一种特殊状态的线性表,栈的实现,一般都是使用线性表来实现,线性表分为顺序表和链表,使用线性表中的顺序表来实现栈时这种栈被称为顺序栈,相应的使用线性表中的链表来实现栈时这种栈被称为链栈,但是需要说明的是,虽然栈是一种特殊的线性表,但是栈和线性表并不是一种数据结构。这篇文章总结如何使用顺序表实现栈,也就是顺序栈的实现。
0 0
JVM:Java运行时数据区域----Java虚拟机栈
JVM:Java运行时数据区域----Java虚拟机栈
0 0
Java基础数组模仿栈数据结构案例
Java基础数组模仿栈数据结构案例
0 0
Java虚拟机-逃逸分析(Escape Analysis)和栈上分配
Java虚拟机-逃逸分析(Escape Analysis)和栈上分配
0 0
中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现
中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现
0 0
简洁明了,Java实现数组模拟栈,先进后出,栈顶为出入口
简洁明了,Java实现数组模拟栈,先进后出,栈顶为出入口
0 0
+关注
田埂、
不惊于荣辱,不借于鼓吹,正余之心,穷于之力
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA 应用排查全景图
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载