对一个可进行带括号、加减乘除运算类的分析

c++实现带加减乘除括号的式子运算 题目: 给定一个带加减乘除括号的运算式子字符串,求其结果 如:(10+20)*3 的结果为90 思路: 一、去括号。用一个栈记录左括号的位置,遍历字符串,读取到右括号后栈pop,进行括号间式子的运算,并将结果字符串替换回原字符串。 二、进行不带括号的式子的运算。用一个栈记录数字,一个栈记录运算符。读到数字直接入栈,读到运算符再进行运算。如果是乘号/除号,拿栈顶数字和下一个数字进行运算,结果入栈;如... 阅读详情

 源程序来源于:http://bbs.tarena.com.cn/viewthread.php?tid=102826&extra=&page=1

这里主要对该程序的运行进行基本的分析,搞清楚其原理。因为我本人原来在参加面试的时候遇到过这样的问题,当时就没有答上来,有点后悔,所有这里补补。

这个程序主要采用的是将数进行压栈的方式,我们知道栈的方式是先进后出,一直遇到当前阶段优先级最高的才做运算,如这个表达式:"1+2*(3+4)",这里的数字栈和运算符分别变化如下:

栈数/符的推入就不例出来了,这里主要例当遇到最高级别的运算符的时候,如何进行运算的:

数字栈:1234

运算符栈:#+*(+

===========================

数字栈:127

运算符栈:#+*(

===========================

数字栈:127

运算符栈:#+*

===========================

数字栈:114

运算符栈:#+

===========================

数字栈:15

运算符栈:#

===========================

到这里根据条件就运算完了,就得到了我们想要的结果。源程序如下:

import java.util.Stack;
public class MyCal {
    // 运算符优先级比较函数
    static int co(char a, char b) {
        if (a == '+' || a == '-') {
            if (b == '+' || b == '-' || b == ')' || b == '#')
                return 1; // a>b
            return -1; // a<B a="=" 1; return ab
        }
        if (a == '(' || a == '#') {
            if (a == '(' && b == ')')
                return 0; // a==b
            else if (a == '(' && b == '#')
                return 2; // can't compare
            else if (a == '#' && b == ')')
                return 2;
            else if (a == '#' && b == '#')
                return 0;
            else
                return -1;
        }
        if (a == ')') {
            if (b == '(')
                return 2;
            else
                return 1;
        }
        return 0;
    }

    // 判断表达式中数字的函数
    boolean isnum(char ch) {
        if ((ch >= '0' && ch <= '9') || ch == '.')
            return true;
        return false;
    }

    // 判断表达式中运算符的函数
    static boolean issign(char ch) {
        if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || 
            ch == ')' || ch == '#')
            return true;
        return false;
    }

    // 计算最简表达式值的函数
    // a和b是操作数,s是运算符
    static double cal(double a, char s, double b) {
        if (s == '+')
            return a + b; // a+b返回a+b的值
        if (s == '-')
            return b - a; // 由于操作数出栈顺序是后进先出,所以减法和除法要、返回值表达式中要交换参数的顺序
        if (s == '*')
            return a * b; // a*b返回a*b的值
        if (s == '/')
            return b / a; // 同减法
        return 0;
    }

    // 计算整个表达式值的函数
    static double calculate(String s) {
        s += "#";
        int i = 0; // 表达式循环条件
        char c; // 表达式中的一个字符
        Stack
  
    num = new Stack
   
    (); // 操作数栈
        Stack
    
      op = new Stack
     
      (); // 操作符栈
        op.push('#'); // 表达式开始的标志
        c = s.substring(i, i + 1).charAt(0); // 取出表达式中的一位
        while (c != '#' || 
               op.peek().toString().charAt(0) != '#') // 没有取到表达式开始或结束的标志'#',就循环计算表达式的值
        {
            if (!issign(c)) // 取到的字符是数字,那么就要取出整个数字
            {
                int start = i;
                int end = 0;
                while (!issign(s.substring(i, i + 1).charAt(0)))
                    // 只要s[i]是数字,就表示一个数还没完
                    end = i++; // 循环条件自加
                double m = 
                    Double.parseDouble(s.substring(start, end + 1)); // 取出从i位开始的数字
                num.push(m); // 数字入栈
                c = s.substring(i, i + 1).charAt(0); // 下一个字符
            } else // 取到的字符是运算符
            {
                switch (co(op.peek(), c)) // 与栈中的运算符比较优先级
                {
                case -1: // 栈中运算符优先级小于当前运算符
                    op.push(c); // 运算符入栈
                    i++;
                    c = s.substring(i, i + 1).charAt(0);
                    break;
                case 0: // 栈中运算符优先级等于当前运算符
                    op.pop(); // 运算符出栈
                    i++;
                    c = s.substring(i, i + 1).charAt(0);
                    break;
                case 1: // 栈中运算符优先级大于当前运算符
                    // 两次取出操作数栈中的数
                    double a = num.pop();
                    double b = num.pop();
                    // 取出运算符栈中的运算符
                    char ss = op.pop();
                    // 计算结果保存在数字栈中
                    num.push(cal(a, ss, b));
                    break;
                }
            }
        }
        return num.peek(); // 表达式计算完毕,返回数字栈中保存的计算结果
    }
    //测试

    public static void main(String[] args) {
        System.out.println(MyCal.calculate("1+2*(3+4)"));
        //System.out.println(MyCal.calculate("1+2*3+5+Math.max(1,3)"));
    }
}


     
    
   
  

本文出自:冯立彬的博客



        
一个非常酷的Js计算器(加减乘除,浮点,以及括号运算,四则混合运算) 这是一个功能比较强大的计算机 运算法 包括了 加减乘除以及括号 整个过程是面向对象实现的 支持四则,浮点,括号,复合运算,可扩展性高,可定制性高 阅读详情

相关推荐

【中缀表达式的运算】(整数带括号加减乘除)&【运算符优先分析法】编译原理or数据结构 Apare_xzc

带括号的中缀表达式的运算(整数的加减乘除) 运算符优先分析法 Author: xzc 2019.11.29 编译原理实验课 输入: begin x:= expression ;end$# 输出: the result of the expression and the possible Error Message(s) 功能: 判断算术表达式的合法性 (括号...

Apare_xzc的博客 1743

java 实现加减乘除混合运算

初衷:解决小学一年级到四年级 基本加减乘除混合运算 基本思路: 表达式:100+3+2-200+(10000/5+(100/2)) 此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转换,转化为 100, 3, +, 2, +, 200, -, 1000...

chita5721的博客 3001

用C语言中栈的思想实现加减乘除四则运算和括号的计算器

用C语言中栈的思想实现加减乘除四则运算和括号的计算器 设计思路 将每个运算符设置优先级,运用栈先入后出的思想,从左到右扫描输入到电脑上的计算公式,将扫描到的数字数据和字符数据的优先级分别存入两个数组,再依次从两个数组中弹出对应的数据和计算符号进行计算 主要问题 1.如何让计算机实现正确的符号计算顺序? 为每个符号设定相应的优先级,在这个程序中我将+,-优先级设置为1,*,/设置为2,(设置为3,)...

九幽小班的博客 8268

java 运算规则_Java 编程处理四则运算式(包含括号)

package com.malakana.cal;import android.annotation.SuppressLint;import java.util.*;public class Yunsuan {Yunsuan(String str1) {EvaluateExpression(str1);}@SuppressLint("UseValueOf")public static String...

weixin_33296185的博客 368

Java加减乘除多重括号计算(有计算过程)

加减乘除多重括号的复杂计算,只需输入你要计算的字符串,立马出正确结果,而且有打印出计算步骤,非常强大,用解析字符串做出来的。望下载后觉得好用的给点好评,望大家顶顶!

输入字符串实现加减乘除四则运算(java)

将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input "33+26 77+70"; String result ""; try { result AccountString input ; } catch Exception e { TODO: handle exception } System out println result ; 输出 :2150">将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input "33+26 77+70"; String result ""; try { result AccountString input ; } catch Exception e { [更多]

简易计算器 java 实现_四则混合运算_包括加减乘除带括号和小数运算

calculator 用到了java.awt java.swing 等库 用逆波兰法求解后缀表达式,再根据后缀表达式求解最终算术值 先看效果: 解释都在代码里啦,灰常详细 hi✿(。◕ᴗ◕。)✿ StartMyCalculator.java package calculator; public class StartMyCalculator { public static void main(String[] args) { // 启动计算器图形界面窗口 new

嘟嘟的博客 4268

java编写一个类,该类可以进行加、减、乘、除四则运算,并且输出运算结果

编写一个Java源程序,其中包含: (1)编写一个类,该类可以进行加、减、乘、除四则运算,并且可以输出运算结果。此外,对于除法,如果被除数为0,该类可以报错。对于加、减、乘、除之外的运算符,该类应该告知无法处理。 (2)编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是:从键盘上输入两个运算数(double 类型)和一个运算符(char 类型),使用(1)中的类输出运算结果(保留两位小数)。如果想继续计算,输入continue,否则,输入finish。

Java实现的表达式求值算法(包括加减乘除以及括号运算)

package com.begoina.zero; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * ...

瞬身疾风的博客 3万+

加减乘除四则混合运算计算器-java

设计GUI界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值进行加、减、乘、除等混合运算功能。可参照windows平台上的计算器。 java 面向对象程序设计》课程设计

Java开发的简单计算器,实现加、减、乘、除

Java开发的简单计算器,实现加、减、乘、除

对一个可进行带括号 加减乘除运算类的分析

对一个可进行带括号 加减乘除运算类的分析

fdyufgf的博客 485

Lane、PHY和Preset Value Bit

每个Lane支持不同的传输速度和带宽,例如PCIe 3.0中,一个Lane的传输速度可以达到8 GT/s(Giga Transfers per second),也就是1 GB/s(GigaBytes per second)。Preset Value Bit(预置值位)是在PCIe 3.0的Lane上新引入的一种机制,用于优化信号传输质量。PCIe设备可以包含多个Lane,例如x1、x4、x8、x16等,表示该设备同时使用的Lane数目,比如x16表示该设备采用了16个Lane,具有更高的传输速度和带宽。

weixin_58083606的博客 1300

C++带括号的四则运算

1、不带括号的四则运算 引用自博客:面试题45:字符串四则运算的实现 题目:有字符串表示的一个四则运算表达式,要求计算出该表达式的正确数值。 说明: 四则运算即加减乘除"±*/" 该表达式中的数字只能是1位(数值范围0~9) 另若有不能整除的情况,按向下取整处理,eg: 8/3得出值为2。 例如:若有字符串"8+7*2-9/3",计算出其值为19。 代码: #include "stdafx.h" #include <stdio.h> #include <string.h> #i

杨杨子江的博客 6886

Trae+Playwright MCP自动化测试全流程指南:从环境搭建到智能体运行

本文提供了一份详细的Trae与Playwright MCP集成指南,涵盖从Node.js、Python环境搭建到智能体创建的全流程。通过结合MCP协议,AI智能体能够理解任务并驱动Playwright执行复杂的浏览器自动化操作,实现从网页数据抓取到端到端测试的智能工作流。

banana的博客 531

从Gcode命令看3D打印机的‘大脑’:Marlin/Klipper固件是如何执行你的指令的?

本文深入解析3D打印机固件Marlin和Klipper如何执行Gcode指令,从语法解析到运动控制算法,再到温度管理,详细揭示了从指令到物理动作的转化过程。通过对比两大固件的设计哲学和性能优化技巧,帮助用户更好地理解和调优3D打印机的核心控制系统。

weixin_26763955的博客 384

模拟表达式运算(加减乘除,负数,带括号)

模拟表达式运算(带括号)

moge的博客 5392

Ubuntu 22.04/24.04 安装 ROS2 完整教程(Humble / Jazzy)

最后更新:2026年2月适用系统:Ubuntu 22.04 LTS(Jammy) / Ubuntu 24.04 LTS(Noble)适用架构:x86_64 / arm64(包括树莓派)

2401_84116277的博客 6035

C语言:字符串 -带括号的加减乘除运算

示例代码: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //去空格 下标方法 void space(char* str); //去空格或任意字符 ,指针方法 void eatspace(char* str, char ch);...

C++++ ++ 6979

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2731

你学Simulink--基于储能系统的建模与仿真场景:飞轮储能系统在电网调频中的作用仿真

本文详细介绍了利用Simulink+Simscape搭建飞轮储能系统(FESS)电网调频仿真模型的全过程。主要内容包括:系统工作原理及调频作用分析,基于Simulink的模块化建模步骤(飞轮、电机/发电机、功率电子接口等组件搭建),调频控制策略实现(频率检测、功率指令生成和模式切换),以及仿真参数设置与结果分析方法。该模型可有效模拟FESS在电网频率调节中的快速响应特性,为新能源存储和智能电网研究提供重要仿真工具,同时可通过参数优化和算法改进进一步提升系统性能。

xiaoheshang_123的博客 169
上一篇: JAVA内部类示例分析
下一篇: 根据自定类型,采用JAVASCRIPT方便进行数据完整性验证,所有页面都可以通用
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值