利用后缀表达式实现一个简单的计算器

简单计算器,支持加减乘除括号乘方复杂表达式 结构体Node存储操作符或者操作数,依靠flag区分。 使用unordered_map映射操作符到int,方便后续操作。initializeMap来初始化该map。 然后使用getRpm得到后缀表达式。 先使用栈转成后缀表达式,放入队列中。 函数stringToDouble将string类型数组转成double类型。 函数cal完成最后一步计算,利用res栈完成后缀表达式的结果计算 #includ... 阅读详情

前缀表达式

运算符在数字的前面,

1 + (2 + 3) * 4 - 5 (中缀)
- + 1 * + 2 3 4 5  (前缀)
  • 前缀表达式的计算方法和后缀表达式类似,只是变成了从右往左扫描

中缀表达式

运算符在中间,运算时需要考虑运算符优先级

1+2*3-5
要先算2*3....

后缀表达式

运算符在数字的后面,运算时不考虑优先级,只需要遇到符号,就把他前面的两个数字进行运算就好了

例如: a b c + + 即: a + (b + c)

1 + (2 + 3) * 4 - 5 (中缀)
1 2 3 + 4 * + 5 -  (后缀)
  • 因为无需考虑优先级,运算是线性结构的,其用栈实现会很简单

中缀表达式 转换为 后缀表达式

  • 运算规律,运算数位置不变,改变的是符号的位置
2 + 9 / 3 - 5   (中缀)
2 9 3 / + 5 -  (后缀)

具体方式

1.从左到右进行遍历
2.运算数,直接输出.
3.左括号,直接压入堆栈,(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈)
4.右括号,(意味着括号已结束)不断弹出栈顶运算符并输出直到遇到左括号(弹出但不输出)
5.运算符,将该运算符与栈顶运算符进行比较,
如果优先级高于栈顶运算符则压入堆栈(该部分运算还不能进行),
如果优先级低于等于栈顶运算符则将栈顶运算符弹出并输出,然后比较新的栈顶运算符.
(低于弹出意味着前面部分可以运算,先输出的一定是高优先级运算符,等于弹出是因为同等优先级,从左到右运算)
直到优先级大于栈顶运算符或者栈空,再将该运算符入栈.
**6.*如果对象*处理完毕,则按顺序弹出并输出栈中所有运算符.

后缀表达式运算步骤

后缀表达式运算步骤:
(以堆栈储存)
从左到右,遇到运算符就弹出相应的运算数,运算后再把结果入栈.最终结果就是栈顶数的值.
(由于该运算为线性结构,具体运算时是不需要储存输出后的运算符,一般是输出一个运算符就进行一次运算,不像图中要储存输出状态.)
注意点:
有时候’-’(负号)是单目运算符,则要修改运算数.
遇到其他运算符(如幂运算)也类似.

python代码例子

'''
中缀转换为后缀
'''

a = "1+(2+6/1+2)"
#a = "2+9/3-5"
# 可能出现的符号 
symbol_1 = ['+','-','*','/']
symbol_2 = ['(']
symbol_3 = [')']
# 符号的优先级
priority = {'#':-1,'(':1,'+':2,'-':2,'*':3,'/':3}
match_2 = {')':'('}
# 存储符号的栈
zhan = []
zhan.append("#")
# 结果
result = []

'''
###  这里只是对表达式进行转换
for i in a:
    # 如果是数字直接添加到结果
    if i.isdigit():
        result.append(i)
    # 如果是 + - * / 运算,则先出栈更低优先级的,然后入栈
    elif i in symbol_1:
        # 如果优先级低,则出栈所有优先级>=的符号
        while priority[i] <= priority[zhan[-1]]:
            result.append(zhan.pop())
        # 压入符号
        zhan.append(i)
    # 如果是左括号,直接压入
    elif i in symbol_2:
        zhan.append(i)
    # 如果是右括号,则出栈,直到遇到了匹配的左括号,然后吧左括号也出栈
    elif i in symbol_3:
        while zhan[-1] != match_2[i]:
            result.append(zhan.pop())
        zhan.pop()
            
result.append(zhan.pop())
print(''.join(result))

'''
# 下面通过将中缀表达式转换为后缀表达式,并进行运算
def my_operation(symbol, a, b):
    a,b = int(a),int(b)
    if symbol == '+':
        return a + b
    elif symbol == '-':
        return a - b
    elif symbol == '*':
        return a * b
    elif symbol == '/':
        return a / b

def to_operation(result, zhan):
    two = result.pop()
    one = result.pop()
    symbol = zhan.pop()
    ret = my_operation(symbol, one, two)
    print(f"{one}{symbol}{two} = {ret}")
    result.append(ret)

### 在表达式转换的时候就一边进行了运算
for i in a:
    # 如果是数字直接添加到结果
    if i.isdigit():
        result.append(i)
    # 如果是 + - * / 运算,则先出栈更低优先级的,然后入栈
    elif i in symbol_1:
        # 如果优先级低,则出栈所有优先级>=的符号
        while priority[i] <= priority[zhan[-1]]:
            to_operation(result, zhan)
        # 压入符号
        zhan.append(i)
    # 如果是左括号,直接压入
    elif i in symbol_2:
        zhan.append(i)
    # 如果是右括号,则出栈,直到遇到了匹配的左括号,然后吧左括号也出栈
    elif i in symbol_3:
        while zhan[-1] != match_2[i]:
            to_operation(result, zhan)
        zhan.pop()
            
to_operation(result, zhan)
print(result)


【栈的应用】中缀,后缀表达式求值以及转换【简单计算器】 表达式就是一个算式,一般分为三种:前缀,中缀,后缀。中缀表达式就是我们在数学计算中所接触的表达式,而前缀或后缀就是把运算符的位置改变了,计算机更倾向于计算前缀或后缀表达式,因为他们不用考虑优先级。我们经常看到这种题目。 阅读详情

相关推荐

括号匹配,实现简单计算器(加减乘除,小括号)

括号匹配,实现简单计算器(加减乘除,小括号)

fakerth的博客 1793

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

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

RunWithSmile的博客 1143

matlab物元可拓模型程序,熵权可拓物元模型

1 概述物元分析方法是中国学者蔡文于20世纪80年代提出的用于解决矛盾问题的技术方法,是研究物元及其变化规律,解决现实世界中不相容问题的有效方法,可应用于生态环境,水资源承载力,农用地分级和土地生态水平等综合评价研究中.本文主要介绍了熵权可拓物元模型的相关概念与该模型的建立过程.2 概念2.1 物元物元分析法的主要思想是把事物用"事物,特征,量值"(分别用N,C,V表示)3个要素以有序三元组的形式...

weixin_33823399的博客 4110

简单实现计算器(加减乘除,小括号,整数)

实现原理就是先把中缀表达式转化为后缀表达式,然后再计算 package Computer; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.Stack; public class PolandCalculation { public static void main(String[] args) { Scanner input = ne..

weixin_47171492的博客 1216

UOS系统手动添加1920x1080分辨率:xrandr命令详解与持久化配置

本文详细介绍了在UOS系统中使用xrandr命令手动添加1920x1080分辨率的方法。针对系统设置中缺失该选项的常见问题,文章提供了从识别显示设备、使用cvt生成模式、添加并切换分辨率,到通过修改.profile文件实现持久化配置的完整步骤。同时涵盖了虚拟机环境、设备名识别及排错等进阶内容,帮助用户彻底解决UOS分辨率配置难题。

weixin_29300931的博客 499

清华数据结构列车调度AC100分

两种思路(1)将目标栈的数据和待混洗的数据逐个进行比较#pragma warning(disable:4996) #include&lt;stdio.h&gt; #include&lt;string.h&gt; #define maxn 1600005 using namespace std; char a[2*maxn][5];//记录操作命令 int stack[maxn]; char pop...

hgtjcxy的博客 924

【Qt项目】制作简单的计算器

使用Qt框架开发的简单的计算器工具,能够实现简单的运算。展示如下:核心设计思路:首先将每个点击后的字符存入字符串,此时字符串中存储的即为中缀表达式,然后将该中缀表达式转换为后缀表达式,最后进行计算。

计算机 3850

SNAP实战:Sentinel-1 GRD数据从预处理到后向散射系数生成全流程解析

本文详细解析了Sentinel-1 GRD数据从预处理到后向散射系数生成的全流程,包括辐射定标、噪声处理、地形校正等关键步骤。通过SNAP软件实战操作,帮助用户掌握SAR影像处理技巧,提升数据质量与分析效率,适用于地表变化监测、灾害评估等应用场景。

weixin_29239661的博客 536

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

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

wahaha 470

恒玄BES调试笔记-BES2500如何打开COMPEXP

打开Compressor and expander会占用资源,这个根据个人项目需求而定吧!打开方法,以及参数修改如下: config\best2300a_ibrt_anc\target.mk SPEECH_RX_COMPEXP ?= 1 apps\audioplayers\bt_sco_chain_cfg_default.c #if defined(SPEECH_RX_COMPEXP) /*****************************************************

leezs的博客 706

火焰烟雾识别系统【数据集+源码+UI界面】

数据集准备:收集并标注火焰与烟雾数据。YOLOv10训练:训练YOLOv10模型来识别火焰和烟雾。实时检测:通过摄像头视频流进行实时检测,并显示检测结果。UI界面设计:用Tkinter设计简易界面,显示检测结果。完成以上步骤后,可以实现一个完整的火焰烟雾识别系统,具备实时检测与友好的用户界面。

2201_76125393的博客 1135

python四则运算计算器总结_Python实现简单的四则运算计算器

摘要:一、算法 1、算法的主要思想就是将一个中缀表达式(Infix expression)转换成便于处理的后缀表达式(Postfix expression),然后借助于栈这个简单的数据结构,计算出表达式的结果。 2、关于如何讲普通的表达式转换成后缀表达式,以及如何处理后缀表达式并计算出结果的具体算法描述不在此一、算法1、算法的主要思想就是将一个中缀表达式(Infix express...

weixin_34786066的博客 2454

《深入浅出多模态》(二):多模态任务及数据集介绍

本文为《深入浅出多模态》系列第二章,《多模态任务介绍与背景》主要介绍多模态模型的概念、技术难点、下游任务(Visual Grounding、VQA、image/Video Captioning等)及各类应用方向数据集展开介绍,本专栏适合从事多模态小白及爱好者学习,欢迎大家关注,如有侵权请联系删除!

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 3834

编译原理 简单计算器的编译器的设计与实现(附源码)

简单计算器的编译器的设计与实现 通过设计、编制、调试一个算术表达式编译器,进一步加深对编译器的词法分析、语法分析、错误处理及输出等环节的理解,获得对实际编译器的构造原理、过程和方法的感性认识,系统掌握语法制导翻译技术。 已知有如下的布尔表达式文法: E→E+T|E-T|T T→T*F|T/F|F F→ +(E)|id 利用LR分析法编制、调试其语法分析程序,生成的中间代码为后缀表达式,通过语法制导定义和后缀表达式进行计算。编制好分析程序后计若干用例,上机 测试并通过所设计的分析程序。算术表达式的LR分析分为

hhypractise的博客 9560

2025爬虫实战:某音直播间实时弹幕获取原理及源码分析

某音直播弹幕虽然没有直接挂在 DOM 上,但由于用的是西瓜播放器,弹幕是通过 JS 接口动态渲染的,这就给了我们 Hook 的机会。关键点是找到调用的位置,然后拦截并输出对象里的message字段。这个思路其实也适用于其他前端渲染的播放器,比如 B 站的 DPlayer、HLS.js、甚至很多自研播放器都有类似结构。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1814

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c语言链表实现简单计算器,链表与栈的典型应用——简单计算器的实现

原标题:链表与栈的典型应用——简单计算器的实现(点击上方公众号,可快速关注)来源:ifndef链接:http://blog.chinaunix.net/uid-28852942-id-3956131.html先来看一个粗糙的简单计算器的实现。他只支持加减乘除,并且一次只能对两个小于10的正整数做一次运算 这是一个粗糙的实现,但是但是仍旧有一些要点体现在上面,比如对 表达式的分析中使用了while...

weixin_31976851的博客 377

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android计算器简单逻辑实现

Android计算器简单逻辑实现 引言:   我的android计算器的实现方式是:按钮输入一次,就处理一次。   但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理。   而这个方式已经很成熟了,但是时间有限,只完成了这个简单的计算器。   至于,这个Android的布局已经在我博客中发布了,不再讲述。            1 package c...

dh7995的博客 278

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python的简单四则运算代码_Python实现简单的四则运算计算器

一、算法1、算法的主要思想就是将一个中缀表达式(Infix expression)转换成便于处理的后缀表达式(Postfix expression),然后借助于栈这个简单的数据结构,计算出表达式的结果。2、关于如何讲普通的表达式转换成后缀表达式,以及如何处理后缀表达式并计算出结果的具体算法描述不在此叙述了,书上有详细的说明。二、简易计算器使用说明使用该计算器类的简单示例如下:# usagec = ...

weixin_39750195的博客 2965

JS实现简易的计算器

JS可以做的事多了,那就用来实现一个计算器吧 看看手机中的计算器,分为普通计算器和科学计算器 自认脑袋不够大,就实现一个普通版本的吧(支持正负数加减乘除等基本连续的运算,未提供括号功能) 看看图示效果, 或在线演示 一、知识准备 1+1 = ? 正常来说,我们看到这个表达式都知道怎么运算,知道运算结果 但计算机不一样,计算机无法识别出这串表达...

weixin_34129145的博客 209

实现一个简单计算器,表达式为字符串表示

实现一个简单计算器,表达式为字符串表示 要求: 实现一个简单计算器,表达式是字符串,如“#(2*(1+3)+8)/4#”,以‘#’做标志位 如: 输入 #(2*(1+3)+8)/4# 输出 4 实现思路: 用栈实现。将输入的中缀表达式通过栈的方式改为后缀表达式计算。 如 (2*(1+3)+8)/4 可先将“(”压入栈1,“2”压入栈2,“*”继续压入栈1,“(”

樊兴旺 6604

后缀表达式

题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。 输入输出格式 输入格式: 输入:后缀表达式 输出格式: 输出:表达式的值 #includ

ztz11的博客 578

codeup 1918 计算器

题目地址:简单计算器 题目思路:给出中缀表达式,转化成后缀表达式(计算之类东西常用用的套路),计算后缀表达式 解析代码已经有很多了,我就不再贴上来了,记录一下踩到的坑,希望以后不会再犯了。 ...

Doreen12138的博客 312

软件技术实习项目一 简单计算器的实现(实验准备)

需求分析 实现简单计算器的基本功能。如:简单的四则运算、带括号的四则运算、小数的运算、负数的运算。 设计实现一个基本友好的用户交互界面,供用户通过点击按钮实现运算、修改、清楚等操作。并且显示结果。当用户输入错误的表达式时,提示用户。 实现最基本的历史查看功能。 基本概念 中缀表达式:即日常生活使用的表达式。如1+1=2。 优点:符合人们的普遍用法。 缺点:由于中缀记法括号是必需的,计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。因此不容易被计...

Sqz7356829的博客 725

中缀表达式转换为后缀表达式实现基本计算机功能

前缀、中缀、后缀表达式(逆波兰表达式)举例说明 运算表达式:(3+4)*5-6 前缀表达式:- * + 3 4 5 6(从右向左扫描) 中缀表达式:(3+4)*5-6 (我们人常见的运算表达式) 后缀表达式:3 4 + 5 * 6 -(从左向右扫描,与前缀表达式相反) 中缀表达式转为后缀表达式的思路 1)初始化两个栈:运算符栈s1和储存中间结果的栈s2 2)从左到右扫描中缀表达式 3)遇到数字时,将其压入s2 4)遇到运算符时,比较其与s1栈顶运算符的优先级 1.如果s1为空,或

m0_52598063的博客 612

Java计算器

本篇博客将利用“后缀表达式”,100多行Java代码(不包括注释)实现一个简单强大的计算器,支持的运算符包括加、减、乘、除、以及小括号。 GitHub代码链接(已经做好封装,可以直接使用) 实现原理及说明: 先将计算式变为程序容易计算的后缀表达式,然后通过后缀表达式进行计算得到结果。 文章分成两部分进,第一部分介绍如何将普通的计算式变为后缀表达式,第二部分为程序实现。 一、后缀表达式 ...

user95的博客 1852

堆栈应用之简单计算器

简单计算器 题目描述: 读入一个只包含+,-,*,/的非负整数计算表表达式,计算该表达式的值 输入格式: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应结果不要输出。 输出格式: 对每个从测试用例输出一行,即该表达式的值,精确到小数点后2位。 样例输入: 30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92 0 样例输出;

shshbdhsjjd的博客 542
上一篇: git简单使用
下一篇: cron表达式
ikalpa
博客等级 码龄9年 19粉丝 23原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值