Java简单计算器(栈实现)

【数据结构】java栈实现简单计算器(中缀表达式) 使用栈完成计算一个表达式的结果:将中缀表达式转换成后缀表达式 1.通过索引遍历表达式 2.建立两个栈: 数栈和符号栈 3.扫描到数字直接入栈(运算数相对顺序不变) 4. 扫描到运算符: 符号栈为空,则压栈 符号栈不为空,扫描到的符号与符号栈栈顶元素进行比较,如果当前符号优先级大于栈中符号,则压栈 小于栈顶符号优先级,则从数栈中pop两个数,符号栈中pop一个符号进行计算,计算结果入数栈,扫描到当前符号继续比较,如果大于则入栈 ... 阅读详情

最近在复习数据结构,就用栈实现了一个简单计算器,增加了AWT的图形界面.

例:输入一个字符串:3*2+1-2

解题思路:
定义两个栈,一个用来存放数字,另一个用来存放操作符.
遍历字符串,如果是数字,就放入数字栈,
如果是操作符,则分两种情况:

  • 1.若字符栈为空,则直接入栈
  • 2.字符栈不为空,需要比较当前要入栈的字符和字符栈顶的字符的优先级
    • 如果前者优先级小于后者, 则需要进行计算(从数字栈取两个值,字符栈取一个值进行计算) ,计算完成之后将结果入数字栈, 再继续判断要入栈的字符和字符栈顶的字符的优先级.
    • 如果前者优先级大于后者, 当前字符入字符栈, 记录一个标志位, 下一个数字入栈之后进行计算.(从数字栈取两个值,字符栈取一个值进行计算).

如何判断计算完:

  • 字符栈为空

最后全部计算完之后,将结果入数字栈,返回该结果即可.

附上代码:

import java.awt.*;
import java.awt.event.*;
import java.util.Stack;

public class Calculator {
    public static void main(String[] args) {

        new MyFrame();
    }
}

class MyFrame extends Frame {
    Button btn0,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,add,min,mul,div,equal,clear,delete;
    TextField tx;

    public MyFrame() {
        /**
         * 1.添加按钮 文本框
         * 2.添加事件监听
         */

        //添加组件 10个数字  5个运算符   一个文本框  一个清零按钮 一个删除按钮
        btn0 = new Button("0");
        btn1 = new Button("1");
        btn2 = new Button("2");
        btn3 = new Button("3");
        btn4 = new Button("4");
        btn5 = new Button("5");
        btn6 = new Button("6");
        btn7 = new Button("7");
        btn8 = new Button("8");
        btn9 = new Button("9");
        add = new Button("+");
        min = new Button("-");
        mul = new Button("*");
        div = new Button("/");
        equal = new Button("=");
        clear = new Button("clear");
        delete = new Button("<-");
        tx = new TextField("");

        //添加一个面板
        Panel panel = new Panel();
        //设置面板布局
        panel.setLayout(new GridLayout(5,3));
        panel.add(btn1);
        panel.add(btn2);
        panel.add(btn3);
        panel.add(btn4);
        panel.add(btn5);
        panel.add(btn6);
        panel.add(btn7);
        panel.add(btn8);
        panel.add(btn9);
        panel.add(add);
        panel.add(btn0);
        panel.add(min);
        panel.add(mul);
        panel.add(div);
        panel.add(delete);
        //将面板添加到Frame中心
        add(panel,BorderLayout.CENTER);
        //将文本框添加到Frame
        add(tx,BorderLayout.NORTH);
        add(panel);
        add(clear,BorderLayout.WEST);
        add(equal,BorderLayout.EAST);


        //添加事件监听
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        MyActionListen myActionListen = new MyActionListen();
        add.addActionListener(myActionListen);
        min.addActionListener(myActionListen);
        mul.addActionListener(myActionListen);
        div.addActionListener(myActionListen);
        clear.addActionListener(myActionListen);
        delete.addActionListener(myActionListen);
        equal.addActionListener(myActionListen);
        btn0.addActionListener(myActionListen);
        btn1.addActionListener(myActionListen);
        btn2.addActionListener(myActionListen);
        btn3.addActionListener(myActionListen);
        btn4.addActionListener(myActionListen);
        btn5.addActionListener(myActionListen);
        btn6.addActionListener(myActionListen);
        btn7.addActionListener(myActionListen);
        btn8.addActionListener(myActionListen);
        btn9.addActionListener(myActionListen);


        setVisible(true);
        setBounds(100,100,200,300);
        setResizable(false);
    }


    //事件监听
    private class MyActionListen implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String text = tx.getText();
            if (e.getSource() == btn0) {
                text += btn0.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn1) {
                text += btn1.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn2) {
                text += btn2.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn3) {
                text += btn3.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn4) {
                text += btn4.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn5) {
                text += btn5.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn6) {
                text += btn6.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn7) {
                text += btn7.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn8) {
                text += btn8.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == btn9) {
                text += btn9.getLabel();
                tx.setText(text);
            }

            if (e.getSource() == add) {
                text += add.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == min) {
                text += min.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == mul) {
                text += mul.getLabel();
                tx.setText(text);
            }
            if (e.getSource() == div) {
                text += div.getLabel();
                tx.setText(text);
            }
            //计算表达式的结果
            if (e.getSource() == equal) {
                if(tx.getText()!=null) {
                    text += equal.getLabel();
                    tx.setText(text);
                    double calculate = calculate(tx);
                    text += calculate;
                    tx.setText(text);
                }

            }
            //清零按钮
            if (e.getSource() == clear) {
                tx.setText("");
            }
            //删除按钮
            if (e.getSource() == delete) {
                String s = tx.getText();
                if (s.length() > 0) {
                    tx.setText(s.substring(0, s.length() - 1));
                }
            }
        }

        /**
         * 计算的核心代码
         * @param tx
         * @return
         */
        private double calculate(TextField tx) {
            //定义两个栈 用来计算数据
            Stack<Double> numStack = new Stack<>();
            Stack<Character> charStack = new Stack<>();
            //进行计算的标志
            boolean flag = false;

            //获取文本框的内容
            String str = tx.getText();
            int begin = 0;
            int end = 0;
            //遍历s
            for (int i = 0; i < str.length(); i++) {
                char ch = str.charAt(i);

                if (!Character.isDigit(ch)) {
                    //如果不是数字 ,首先判断字符栈是否为空 将end置为当前位置
                    end = i;
                    //将begin 和 end之间的的数字入数字栈
                    numStack.push(Double.parseDouble(str.substring(begin,end)));
                    begin = end+1;

                    if (flag == true) {
                        double second = numStack.pop();
                        double first = numStack.pop();
                        char opt = charStack.pop();
                        double result = operation(first, second, opt);
                        //将计算出的结果进行入栈
                        numStack.push(result);
                    }

                    if (!charStack.empty()) {
                        //非空 判断优先级
                        if (level(ch, charStack.get(charStack.size() - 1))) {
                            //优先级高 将flag设置为true 下一步放入数字的时候进行运算
                            flag = true;
                        }
                    }
                    //进行入栈
                    if(str.charAt(i) != '=') {
                        charStack.push(ch);
                    }
                }

            }


            //全部入栈完成 进行计算
            while (!numStack.empty() && !charStack.empty()) {
                //从底往上计算
                double first = numStack.remove(0);
                double second = numStack.remove(0);
                char opt = charStack.remove(0);
                double result = operation(first, second, opt);
                //运算完进行入栈
                numStack.add(0,result);
            }
            return numStack.pop();
        }


        /**
         * 进行计算
         * @param first
         * @param second
         * @param opt
         * @return
         */
        private double operation(double first, double second, char opt) {
            switch (opt) {
                case '+':
                    return first + second;
                case '-':
                    return first - second;
                case '*':
                    return first * second;
                case '/':
                    return first / second;
            }
            return -1;
        }

        /**
         * 判断ch 和 topCh的优先级
         * @param ch
         * @param topCh
         * @return
         */
        private boolean level(char ch, Character topCh) {
            switch (ch) {
                case '+':
                    return false;
                case '-':
                    return false;
                case '*':
                    if(topCh == '+' || topCh == '-') {
                        return true;
                    }
                case '/':
                    if(topCh == '+' || topCh == '-') {
                        return true;
                    }
            }
            return false;
        }
    }
}

运行结果 :

在这里插入图片描述

java使用stack栈实现简单四则计算器 使用栈思想实现计算器 阅读详情

相关推荐

Java用栈实现的计算器

Java用栈实现的计算器,界面用swing实现,不支持括号

Java数据结构-栈(实现计算器)

数据结构-栈(实现计算器)

vintind的博客 710

JAVA 版计算器,通过栈实现

小程序,听说能换积分,发个把,能用,application 进入dos运行就可以

数据结构与算法——Java实现栈、逆波兰计算器(整数加减乘除)

我们平时使用的计算器,其底层就是利用了栈这个概念对这个算式进行理解栈的英文为(stack)栈是一个先入后出(FILO-First In Last Out)的有序列表(stack)是限制表素的插入和除只能在性的同一端进行的一种性表。允许插入和删除的端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除图解方式说明。

weixin_51351637的博客 1959

Java利用堆栈实现简单四则运算

NULL 博文链接:https://chinamobile.iteye.com/blog/1630919

同一台电脑使用模拟ModbusTcp主从通讯的时候,Wireshark抓取不到包

在使用ModBus Slave和Poll模拟主从通讯的时候,发现Wireshark怎么都抓取不到包怎么排查和解决?

HUJIANGMING的博客 705

Java栈实现综合计算器

在韩顺平老师的数据结构课程P35中代码实测出现了问题,无法处理如7-3*5+2此类高级运算符前面跟着个-的情况,按照老师的代码3*5=15之后会继续和+2进行运算最后结果为7-17=-10,而正确结果为-6,在此我尝试解决这个问题。其实一开始我还在想是否应该用递归来解决这个问题,当栈中有多层数据的时候使用递归解决,但是觉得并不需要这么麻烦,因为符号位最多只能堆积两层。只需要在7-3*5+2的乘法判断完之后,紧接上-和+的判断,便可以解决问题。

Byrd_的博客 347

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8524

栈实现简单计算器【java】

仅简单实现+,-,*,/

记录学习,共同进步 474

【低空经济】低空无人机公共测试场与验证基地设计方案

公共测试场与验证基地是为低空无人机相关技术的研发、测试与应用提供一个系统性的平台。在无人机产业蓬勃发展的背景下,建设一个配备完善、功能齐全的公共测试场与验证基地显得尤为重要。该基地不仅可以作为无人机的测试和验证场地,还可以为相关企业、科研机构以及政府部门提供技术支持和服务。因此,为此基地的设计方案必须综合考虑功能性、安全性、灵活性与可持续性等多方面的因素。首先,公共测试场需划分为多个专用区域,以便满足不同类型无人机的测试需求。这包括低空飞行区域、紧急着陆区、操控模拟区和监测与数据采集区等。

2502_92579126的博客 1602

蜻蜓fm爬虫python

本文介绍了一个用于下载蜻蜓FM音频书籍的Python脚本实现。该脚本主要功能包括:1)通过账号密码登录获取认证信息;2)从目标书籍主页提取版本信息;3)获取书籍节目总数和分页信息;4)生成节目下载链接(使用HMAC-MD5加密算法生成请求签名);5)下载音频文件并保存。脚本采用多种反爬措施:设置User-Agent模拟浏览器行为、使用动态时间戳、HMAC-MD5签名验证等,有效规避简单的反爬机制。整个流程包括登录认证、获取书籍信息、生成下载链接和保存音频文件四个步骤,实现自动化批量下载功能。

野猫炫的博客 913

java中栈结构的详解以及实现简单计算器

java中栈结构的详解以及实现简单计算器

wang20010104的博客 862

Altair HyperWorks 2022.3.0 Suite下载

Altair HyperWorks开发团队提供了新的一流技术,以设计和优化高性能、高效和创新的产品,并发布了HyperWorks 2021.2套件。与所有新版本一样,这个版本包含了新特性、增强功能,并修复了前一个版本中用户报告的各种问题,提供了总体上更稳定的体验。链接: https://pan.baidu.com/s/1rYietmQLQUboHiJzYoE9WQ?pwd=m9yh 提取码: m9yh 复制这段内容后打开百度网盘手机App,操作更方便哦。

weixin_48469365的博客 2131

java栈实现简单的计算器

一、代码 直接上代码,分为两个类calc.StackCalculator.java,calc.Calculator.java 1、StackCalculator.java /** * 用栈实现表达式的运算v1.0 * 支持运算:+、-、*、/、%、^、!、() * 输入的表达式需以&quot;#&quot;结束 */ package calc; import java.util.Stack; pub...

逝水流云的博客 3024

(6)NUC980 SPI Nand 启动

方式一:下载到SPI-NAND-Flash中,这种方式可以将程序固化到SPIflash中,可以掉电保存。第二种方式下载到DDR中程序掉电丢失,但是DDR调试方便,时候调试的时候使用。之前的设置都是基于SD卡启动,今天测试一下是用SPI flash启动。方式二: 下载到DDR中,①设置为USB启动②下载到DDR中③运行。1:烧写BootLoader。

卤煮小鱼的博客 1755

AI快速变现之路,AI视频创作

初期投入$3000(工具订阅+样片制作),重点攻克跨境电商和本地生活服务市场。关注2025年AIGC视频工具的API降价趋势(如Pika企业版折扣可达50%),建议与云服务商签订长期合作协议。

qq_29896351的博客 1983

利用栈实现简单计算器(java)

利用栈实现简单计算器(java) package Stack; class Stack { private int maxSize; private int top = -1; private int[] stack; public Stack(int maxSize) { this.maxSize = maxSize; stac...

found 404-xq 的博客 337

(王道408考研操作系统)第一章计算机系统概述-第三节2:中断和异常

注意!!! 本节内容和《计算机组成原理》中的中断有重合,如果需要详细了解的话可以点击链接跳转:(计算机组成原理)第七章输入和输出系统-第四节2:I/O方式之程序中断方式 为了内容完整,部分内容会借用上述文章 文章目录一:中断和异常的基本概念(1)中断和异常的定义 一:中断和异常的基本概念 在操作系统引入核心态和用户态这两种工作状态后,就需要考虑两种状态之间是如何切换的。 操作系统内核工作在核心态,用户程序工作在用户态,系统不允许用户程序使用核心态的功能,但是用户程序为了完成某些操作又必须使用这些功能

快乐江湖的博客 3535

java 栈的应用 - 实现简单的加减乘除的计算器

对于一个简单的加减乘除表达式,怎么去计算其结果呢? 比如 21 + 3 - 5 * 0。|不包含 (,)| 这里使用的实现思路是: 准备两个栈,分别用于存放 数字和 操作符。(为了便于后续表达,分别命名为numStack, opStack); 然后就是遍历这个字符串,从前往后的提取里面的数字和符号,进行下一步的操作: 如果提取到的是数字,直接存入numStack; 如果提取到的是符号,就先判断符号栈是否为空: 如果是空的,直接存入到opStack; 如果符号栈不是空,就比较符号栈的栈顶元素与当前符号的

Cat的专栏 1421

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java栈实现简单的计算器

/** * java栈实现简单的计算器 * 计算表达式的值 * 实现+、-、/、*、%、(、) * #表示表达式的开始与结束 */ import java.util.Stack; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Calculator { private Stack<String> operation = new..

逝水流云的博客 316

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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<>(); S

田埂、の技术博客 345

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java简单实现计算器——用数组实现栈

Java简单实现计算器——用数组实现栈 参考尚硅谷 数据结构视频 package DataStructures.stack; import java.util.Scanner; class ArrayStack2 { private int maxSize;//栈的容量 private int[] stack; private int top=-1; public ArrayStack2(int maxSize)//初始化栈的大小 { this.m

LHH的博客 215

用Java实现的一个简单计算器,使用栈实现运算操作

java实现的一个简易计算器 计算器界面如下:(试用按例在图片上有所显示) 具体代码如下(如果看不懂可以私信我,记得点赞哦): PS:我还是个小菜鸟,写的不好处希望大家多多体谅 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.EmptyStackException; import ...

lxj2116的博客 321

JAVA栈实现简单的计算器

本次使用栈来模拟计算器的实现 例如 15 + 2 × 3 - 3 我们需要两个栈来辅助实现 符号栈(用来存储符号) 数字栈(用来存储运算的数字和结果) 实现思路: 5+2*3-3 1.通过一个index值(索引),来遍历我们的表达式 2.如果我们发现是一个数字。就直接入数栈 3.如果发现扫描到的是一个符号,就分如下情况 3.1 如果发现当前的符号栈为空,就直接入符号栈。 3.2 如果符号栈有操作符,就进行比较。 1)如果当前的操作符的优先级小于或者等于栈中的操作符,这时就需要从数栈中pop出两个数

CONSOLE___的博客 959

java用栈如何实现计算器_利用栈实现简单计算器(java)

利用栈实现简单计算器(java)package Stack;class Stack {private int maxSize;private int top = -1;private int[] stack;public Stack(int maxSize) {this.maxSize = maxSize;stack = new int[maxSize];}public boolean isFul...

weixin_39908462的博客 233

栈java实现(二)简单中缀计算器实现

一、思路分析   这里我们使用自定义的栈结构完成一个小练习:简单的不带括号的中缀表达式计算器的实现。分析思路如下: 首先创建一个类来自定义栈结构以及所需要用到的一些基本方法。 实例化两个栈来分别存放数字和符号。 建立一个索引index来对中缀表达式进行遍历。 开始扫描遍历表达式: 如果是数,我们就查看表达式下一位 ,如果下一位也是数,就进行拼接操作,直到下一位不是数,然后将得到的数直接入栈。 ...

猪奥奥的Blog 374
上一篇: 集合-LinkedList源码分析
下一篇: HashMap1.8源码分析
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值