栈--简单计算器(后缀表达式)

栈实现简单计算器(后缀表达式) 目录 一、后缀表达式举例 二、需求 三、字符串扫描法 思路分析 代码实现 四、遍历ArrayList法 思路分析 代码实现 一、后缀表达式举例 A:a+b的后缀表达式为ab+; B:(a+b)*c-(a+b)/e的后缀表达式为ab+c*ab+e/-; 二、需求 A:输入一个后缀表达式,并用栈计算结果; B:支持小括号和... 阅读详情

JAVA实现后缀表达式–>简单计算器(栈)

预备知识:

  1. 前缀表达式
  2. 中缀表达式
  3. 后缀表达式

比如 5 * 2 + 3
前缀表达式 : + * 5 2 3
中缀表达式:5 * 2 + 3
后缀表达式:5 2 * 3 +

计算机中,使用后缀表达式更容易进行计算:
思想:遇到数字就入栈,遇到运算符就pop出两个数进行运算然后将结果入栈。最后留下一个栈顶元素即为结果。

可见,实现后缀表达式计算出并不困难。

这里的难点是怎么把我们常用的中缀表达式转换成后缀表达式:

这里先说中缀表达式的思想:

  1. 初始化两个栈,运算符栈s1和储存中间结果的栈s2
  2. 从左至右扫描中缀表达式
  3. 遇到操作数时,将其压入s2
  4. 遇到运算符时,比较其与s1栈顶运算符的优先级
    4.1 如果s1为空,或栈顶运算符为左括号 “(” ,则直接将此运算符入s1栈
    4.2 否则,若优先级比s1栈顶运算符的高,也将运算符压入s1
    4.3 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到4.1与s1中新的栈顶运算符相比较
  5. 遇到括号时:
    (1)如果是左括号 “(” 。则直接压入s1
    (2)如果是右括号 “)” 。则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃。
  6. 重复步骤2至5直到遍历完中缀表达式
  7. 将s1中剩余的运算符依次弹出并压入s2

奉上步骤图,自己体会。【狗头】
在这里插入图片描述
在这里插入图片描述

此时,中缀表达式转后缀表达式已经完成了。随后我们只需要根据后缀表达式的求值进行即可。

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 后缀表达式:  我们常使用的为中缀表达式  5+3*8
 * 计算机更容易实现的后缀表达式: 3 8 * 5 +
 *
 * 步骤--》1.先将中缀表达式转换成后缀表达式   (将中缀表达式转换成为list集合,通过stack将中缀表达式转换成后缀表达式)
 * 2. 在将后缀表达式进行计算求值
 */
public class PostfixExpression {
    public static void main(String[] args) {
        String expression = "10*((20+30)*4)-10";
        List<String> centerList = AnalyticExpression(expression); //将中缀表达式转换成list集合
        System.out.println("中缀表达式:"+centerList.toString());
        List<String> postfixList = toPostfixExpression(centerList); //将中缀集合转换成后缀表达式集合
        System.out.println("后缀表达式:"+postfixList.toString());
        int res = calculator(postfixList);
        System.out.println(res);
    }


    /**
     * 将字符串转换成字符串集合
     *
     * @param expression 传过来的字符串后缀表达式
     * @return 返回的字符串集合
     */
    public static List<String> AnalyticExpression(String expression) {

        List<String> list = new ArrayList<>();
        char c;
        String str = "";  //用于拼接多位数
        int i = 0;
        while (i < expression.length()) {
            if ((c = expression.charAt(i)) < 48 || (c = expression.charAt(i)) > 57) {//如果不是数字
                list.add(c + "");
                i++;
            } else {
                str = "";
                while (i < expression.length() && ((c = expression.charAt(i)) >= 48) && ((c = expression.charAt(i)) <= 57)) {
                    str += c;
                    i++;
                }
                list.add(str);
            }
        }
        return list;
    }

    /**
     * 将中缀表达式转换成后缀表达式
     * 思路:
     * 1)初始化两个栈,运算符栈s1和储存中间结果的栈s2
     * 2)从左至右扫描中缀表达式
     * 3)遇到操作数时,将其压入s2
     * 4)遇到运算符时,比较其与s1栈顶运算符的优先级
     * 4.1 如果s1为空,或栈顶运算符为左括号 "(" ,则直接将此运算符入s1栈
     * 4.2 否则,若优先级比s1栈顶运算符的高,也将运算符压入s1
     * 4.3 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到4.1与s1中新的栈顶运算符相比较
     * 5)遇到括号时:
     * (1) 如果是左括号 "(" 。则直接压入s1
     * (2) 如果是右括号 ")" 。则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃。
     * 6)重复步骤2至5直到表达式的最右边
     * 7)将s1中剩余的运算符依次弹出并压入s2
     *
     * @param centerList
     * @return
     */
    public static List<String> toPostfixExpression(List<String> centerList) {
        Stack<String> s1 = new Stack<>();
        Stack<String> s2 = new Stack<>();
        List<String> list = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        int i = 0;
        while (i < centerList.size()) {
            if (centerList.get(i).matches("\\d+")) { //如果是数字
                s2.push(centerList.get(i));
                i++;
            } else if (centerList.get(i).equals("*") || centerList.get(i).equals("/")||centerList.get(i).equals("+")||centerList.get(i).equals("-")) { // 如果是运算符
                if (s1.empty() || s1.peek().equals("(")) {   // 符合4.1
                    s1.push(centerList.get(i));
                    i++;
                } else if (getLevel(centerList.get(i)) > getLevel(s1.peek())) { // 符合4.2
                    s1.push(centerList.get(i));
                    i++;
                } else {
                    s2.push(s1.pop());
                }
            } else {// 为括号
                if (centerList.get(i).equals("(")) {
                    s1.push(centerList.get(i));
                    i++;
                } else if (centerList.get(i).equals(")")) {
                    while (!s1.peek().equals("(")) {
                        s2.push(s1.pop());
                    }
                    s1.pop();
                    i++;
                }
            }
        }

        //将s1剩余的运算符依次弹出并压入s2
        while (!s1.empty()){
            s2.push(s1.pop());
        }

        while (!s2.empty()){
            list.add(s2.pop());
        }

        for (int j = list.size()-1; j >= 0; j--) {
            list1.add(list.get(j));
        }
        return list1;
    }

    /**
     *
     * @param list
     * @return
     */
    public static int calculator(List<String> list) {
        Stack<String> stack = new Stack<>();
        for (String s : list) {
            if (s.matches("\\d+")) {//如果是数字的话,直接入栈
                stack.push(s);
            } else { // 是符号的话,就pop出两个元素进行运算然后入栈
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                if (s.equals("+")) {
                    res = num1 + num2;
                } else if (s.equals("-")) {
                    res = num1 - num2;
                } else if (s.equals("*")) {
                    res = num1 * num2;
                } else if (s.equals("/")) {
                    res = num1 / num2;
                } else {
                    throw new RuntimeException("运算符异常");
                }
                stack.push("" + res);
            }
        }
        return Integer.parseInt(stack.peek());
    }

    /**
     * 获取运算符的优先级
     *
     * @param str
     * @return 加减 0  乘除 1
     */
    public static int getLevel(String str) {
        int level = 0;
        if (str.equals("*") || str.equals("/")) {
            level = 1;
        }
        return level;
    }
}
【栈的应用】中缀,后缀表达式求值以及转换【简单计算器】 表达式就是一个算式,一般分为三种:前缀,中缀,后缀。中缀表达式就是我们在数学计算中所接触的表达式,而前缀或后缀就是把运算符的位置改变了,计算机更倾向于计算前缀或后缀表达式,因为他们不用考虑优先级。我们经常看到这种题目。 阅读详情

相关推荐

QT实现简单计算器

一、模块图 二、核心算法 —– 中缀表达式转化为后缀表达式 1、将中缀表达式转换为后缀表达式的算法思想: 1)计算机实现转换: ·开始扫描; ·数字时,加入后缀表达式; ·运算符: a. 若为 ‘(‘,入栈; b. 若为 ‘)’,则依次把栈中的的运算符加入后缀表达式中,直到出现’(‘,从栈中删除’(’ ; c. 若为 除括号外的其他运算符, 当其优先级高于除’(‘以外的栈

snow_5288的博客 1万+

学习记录=>后缀表达式实现计算器

使用juc提供的栈;这么计算,考虑到了括号的影响。

m0_54041198的博客 276

LPDDR5时序精调:深入解析Read Gate Training的两种模式

本文深入解析了LPDDR5内存中关键的Read Gate Training技术,详细对比了RDQS Toggle Mode(翻转模式)与Enhanced RDQS Mode(增强模式)的工作原理、时序参数及适用场景。文章阐述了在高速数据传输下精准校准时序的必要性,并提供了两种模式的实战选型指南与系统级调试思路,帮助工程师优化内存性能与稳定性。

weixin_29219189的博客 368

计算器的实现

计算器的实现基础是用栈的先进后出的特性的,将中缀表达式转换成后缀表达式后,对后缀表达式进行操作运算就会方便很多,而中缀表达式就是我们人类经常看到的表达式,例如(3+4)×5-6这就是中缀表达式,而后缀表达式就是相比于人来说,机器更容易看懂的表达式,例如(3+4)×5-6的后缀表达式是:3 4 + 5 * 6 -

m0_56280646的博客 458

TESSY创建单元测试或集成测试工程

我们以tessy5.1为例,给大家展示单元测试和集成测试工程的创建过程。

空气中的告白专栏 1686

迪文串口屏开发环境搭建全流程:从DGUS Tool到串口联调

串口屏作为嵌入式人机交互的核心组件,通过串口通信实现主控MCU与显示终端的指令交互。其工作原理基于变量地址映射,主控读写VP地址即可驱动屏上控件,兼具低功耗与高稳定性。在工业控制、医疗设备及智能家居面板等场景中,串口屏能显著降低开发门槛与硬件成本。迪文屏凭借DGUS Tool上位机与自定义串口协议,成为主流选择。掌握DGUS Tool版本匹配、串口驱动安装及VP地址规划,是快速搭建开发环境的关键。

weixin_33937499的博客 607

后缀表达式计算器

#include<iostream> #include<stdio.h> #include<string.h> #include<malloc.h> using namespace std; typedef struct StackNode { int data; struct StackNode *next; } StackNode,*LinkStack; void InitStack(LinkStack &S) //构造一个空栈 {.

qq_54467680的博客 955

Python量化入门:用pytdx获取800个交易日K线数据的完整指南(附代码)

本文为Python量化交易初学者提供了使用pytdx库免费获取股票日线级别K线数据的完整指南。文章详细介绍了从环境搭建、单只股票数据获取,到构建健壮的批量下载器、数据清洗与验证,再到基础分析与可视化的全流程,并附有可直接运行的代码示例,帮助读者快速建立本地股票数据库。

weixin_29050513的博客 1465

逆波兰计算器(后缀表达式)的解析和代码(java)

需要学到面对对象

weixin_74457859的博客 666

SAP移动类型

SAP移动类型移动类型定义 移动类型定义

qq_20593197的博客 6205

E2B Agent Runtime Sandbox 沙箱技术架构研究

本实现指南基于E2B的技术架构,提供了完整的基于Firecracker和Docker的Agent Runtime Sandbox后端服务实现方案。架构设计:参考E2B的分层架构,实现API层、管理层和虚拟化层Firecracker集成:深度集成Firecracker提供硬件级安全隔离完整功能:支持文件读写、shell执行、浏览器访问等核心功能生产就绪:提供Docker部署、监控、测试和安全配置可扩展性:设计支持水平扩展和高并发场景。

AI天才研究院 748

利用后缀表达式实现简单计算器功能

文章目录前言一、原理二、使用步骤1.中缀表达式转换为后缀表达式2.计算结果三、实现代码1.启动类2.工具类3.策略类总结 前言 最近在看数据结构,看到如此神奇的后缀表达式运用思想,于是就自己写代码实现了 一、原理 简单算术表达式是使用中缀表达式进行表达的,但是这样就无法解决表达式优先级问题,因此利用栈先进后出原理转换为后缀表达来解决简单算术表达式优先级问题。 二、使用步骤 1.中缀表达式转换为后缀表达式 遍历中缀表达式,数字则直接输出,(除括号外)符号则进栈,进栈前先判断栈顶元素的符号优先级和当前需要进

RunWithSmile的博客 1143

Python爬虫实战:新浪财经股票金融数据全方位抓取教程

本教程系统介绍了新浪财经股票数据爬取技术,从静态网页解析、实时接口请求到异步爬取和数据存储,帮助你搭建了一个完整的金融数据采集流程。未来,可以结合深度学习模型进行行情预测,或者将数据接入量化交易系统,实现自动化投资。

2201_76125261的博客 2210

栈和栈的应用(后缀表达式的转化和简单计算器)

文章目录栈的特点栈的常用方法 栈的特点 栈(Stack)是一种线性存储结构,栈中的数据元素遵守”先进后出"(First In Last Out)的原则,简称FILO结构。限定只能在栈顶进行插入和删除操作。 栈的常用方法 ...

weixin_45756488的博客 683

把开源 Skills 集成到 LangGraph 项目

1. 定义智能体状态(必须包含 messages,其他字段按需扩展)messages: List[HumanMessage | AIMessage | ToolMessage] # 消息流(核心)skill_output: Optional[str] # 存储 Skill 执行结果next_node: str # 控制流程跳转# 2. 定义智能体决策节点(决定是否调用 Skill)"""智能体决策逻辑:根据用户输入判断是否调用开源 Skill"""# 获取最后一条用户消息。

lpfasd123的博客 900

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA数据结构 - 栈与中缀表达式,后缀表达式实现简单计算器

先进后出的数据结构,入栈,出栈 ,定义一个指针始终指向栈顶,没有数据时为-1 1.使用数组模拟实现栈-定义结构 class ArrayStack { private int MaxSize; //表示栈的最大空间 private int[] array; //表示存放数据的数组 private int top = -1; //表示栈顶,起始位置...

wahaha 470

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【HDU 1237】简单计算器(后缀表达式+栈的应用)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15707Accepted Submission(s): 5362 Problem Description 读入一个只包含 +, -, *...

a5615024的博客 185

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

简单计算器(JAVA C语言队列和栈实现),中缀表达式转后缀表达式

根据算法笔记247页的简单计算器的C语言代码(补充了带’()'的) 问题: java 在编写的时候出现了类的浅拷贝和深拷贝。进入队列的深拷贝会将队列的第一个位置和第二个位置(存储的第二个同名的临时存储变量)使用深拷贝会将第一和第二个都变成相同的 #include<iostream> #include<cstdio> #include<string> #include<stack> #include<queue> #include<map&g

weixin_43749213的博客 307

算法笔记 栈的应用 简单计算器 中缀和后缀表达式

思路 将输入的中缀表达式转后缀表达式 遇到数字,则算出数值,直接放入队列(注意数据非仅有一位,需要计算出整个数的值) 遇到运算符先判断优先级是否小于栈中top的运算符 如果是,将栈中的运算符pop到队列中,直到栈中没有运算符优先级更大为止 如果不是,则直接将运算符放入栈中 最后如果栈中剩余运算符,则直接放入队列中 计算后缀表达式,遍历队列 如果为数值,则放入栈中 如果为运算符 从栈中pop出两个数(注意是先第二个后第一个,后进先出嘛) 随后运算 最后把计算完成的数放入栈中 代码

Cindy_00的博客 272

手把手教数据结构与算法:栈的应用(平衡符号和简单计算器)

这篇文章详细介绍了栈的基本概念、定义以及常见操作,然后通过两个具体的问题展示了栈的应用:平衡符号和简单计算器的实现。在平衡符号问题中,通过栈的特性判断输入的字符串中的括号是否匹配,实现了括号匹配的功能。在简单计算器问题中,利用栈来处理中缀表达式,将中缀表达式转换为后缀表达式并计算其值,最终得到中缀表达式的计算结果。文章不仅介绍了问题的描述和解题思路,还给出了详细的代码实现和相应的示例输入输出,使读者能够更深入地理解栈的应用和相关算法。

weixin_73611714的博客 4703

算法笔记 栈 中缀转后缀表达式 codeup 1918 简单计算器

#include <iostream> #include <string> #include <stack> #include <queue> #include <map> using namespace std; struct node{ double num; //操作数 char op; //操作符 bool flag; //true表示操作数, false表示操作符 }; string str; st.

BoyInC0de的博客 306

栈实现简单计算器(二)??中缀表达式转为后缀表达式

@TOC 1.中缀表达式转变成后缀表达式思路 首先创建一个符号栈(存放符号),一个集合(用来存储最终的后缀表达式, 本来是创建一个栈,但是该栈在遍历过程中只负责入栈没有出栈,并且最终的结果是后缀表达式的逆序,所以采用list更方便) 处理数字:当遍历中缀表达式为数字(用正则表达式匹配)直接添加到集合中 处理小括号和栈空:当为符号"(“或者栈为空时,直接入符号栈;当为”)",直接遍历符号栈并将 符号栈的符号添加到集合中,直到符号栈的栈顶为"(",循环结束在出栈栈顶"("; 处理运算符优先级:当将要入栈的运算

weixin_45876091的博客 385

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

源文件  1#include #include #include #include #define emptytos (-1)//空栈 #define minstacksize (5)//最小栈大小 //typedef char element; #define element int //顺序栈的实现 typedef struct stackrecord { int ca

曾经若许闲乘燕 1401

栈实现的简单计算器

/***************************************************************** 栈实现的简单计算器 *****************************************************************/ #include #include #define

2506

1918 Problem A 简单计算器

问题 A: 简单计算器 时间限制: 1 Sec  内存限制: 32 MB 提交: 633  解决: 288 [提交][状态][讨论版][命题人:外部导入] 题目描述 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输入 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入...

子衿 328
上一篇: JAVA栈实现简单的计算器
下一篇: JAVA入门简介
AlonScholar
博客等级 码龄7年 25粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值