源程序来源于: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)"));    }}

本文出自:冯立彬的博客

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

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

  1. c语言float如何做减法,利用c语言设计开发一个简单计算器,可进行加减乘除运算....

    共回答了18个问题采纳率:94.4% #include #include void add(float num1,float num2) { printf("num1 + num2 = %6 ...

  2. 怎么做加减计算机程序vb,如何用VB设计一个简单计算器能进行加减乘除运算?...

    参考下: 计算器的程序,很简单,只弄了+-法,乘除没弄,只要把代码看懂照着+-法改一下就行了,不过涉及到多级运算只用一个LastClick是不行的 程序的控件就两种 CommandBotton和Tex ...

  3. C语言:模拟实现一个计算器(可以完成加减乘除运算)

    使用switch-case-语句实现 #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <stdlib.h ...

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

    模拟表达式运算(加减乘除,负数,带括号) 要模拟表达式运算需要目标不同表达式之间的转换关系. 可以参考我的另一篇文章(中后缀表达式转换) 由于水平问题(自己写的总有bug,而且又长又繁琐),所以参考代 ...

  5. 【软工Work1】四则加减乘除混合运算(带括号、真分数)

    大家好,很高兴写一片博客给分享自己的这段奇妙的experience of coding! 本来想听老师建议在github上down一些代码的,但之后看网上代码都挺复杂怕难改.而且自己更简单的自己的思路 ...

  6. 表达式求值:从“加减”到“带括号的加减乘除”的实践过程

    本文乃Siliphen原创,转载请注明出处:http://blog.csdn.NET/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个 ...

  7. C---编写程序:实现一个随堂测试,能进行加减乘除运算。要求如下:(1)随机产生两个1~10的正整数,在屏幕上输出题目,如:5+3=?(2)学生输入答案,程序检查学生输入答案是否正确,若正确,

    编写程序:实现一个随堂测试,能进行加减乘除运算.要求如下: 1)随机产生两个1~10的正整数,在屏幕上输出题目,如:5+3=? 2)学生输入答案,程序检查学生输入答案是否正确,若正确,则输出" ...

  8. 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分

    代码 /*第二题:利用接口做参数,写个计算器,能完成加减乘除运算.(1)定义一个接口Compute含有一个方法int computer(int n, int m).(2)设计四个类分别实现此接口,完成 ...

  9. 设计一个计算器,实现0-9数字间的加减乘除运算

    设计一个计算器,实现0-9数字间的加减乘除运算 设计一个计算器,实现0-9数字间的加减乘除运算 提示: (1)采用JavaScript定义加减乘除方法: (2)通过document.getElemen ...

最新文章

  1. 李航-统计学习方法-笔记-1:概论
  2. ftp: connect: 没有到主机的路由_Qt之FTP上传/下载文件操作
  3. 解决:java.lang.NoSuchMethodException: gentle.entity.User.<init>()
  4. 《你不知道的JavaScript》中卷 KYLE SIMPSON 著 单业 姜南 译
  5. mysql jdbc 单利_java单利模式设计
  6. Pseudo code:伪代码
  7. CentOS 6.3下配置LVM(逻辑卷管理)
  8. 太难了!用Python数据造假后,我被公司升职加薪了~
  9. 路径规划;a*算法 demo_路径规划A*算法
  10. 柱状图之最大矩形面积
  11. 蜀山剑侠传-----第二十回
  12. iOS系统下常用的三方应用URL Scheme值
  13. WeaveSocket框架-Unity太空大战游戏-概述0
  14. 爬虫--破解验证码的几种方式
  15. 【BZOJ1014】【JSOI2008】火星人prefix Splay处理区间,hash+dichotomy(二分)check出解...
  16. 有那些适合苹果手机用的蓝牙耳机?适合苹果手机用的蓝牙耳机推荐
  17. jQuery 实现消消乐
  18. OSChina 周日乱弹 —— 阿里爸爸辞职了
  19. 转载:SRT传输库评估报告(V1.0.0)
  20. 2610_lab2 命令行与快捷键

热门文章

  1. C++调用Go方法的字符串传递问题及解决方案
  2. 【鲲鹏来了】手把手教你在鲲鹏上使用编程语言——Java、Python
  3. 线上一个数组查询遇到的坑
  4. 推荐系统实战-概念理解入门篇
  5. Kotlin学习笔记21 协程part1 基本概念
  6. 工作笔记-安装完virtualbox,新建好虚拟机却提示无法打开
  7. 设计模式笔记三:单例模式
  8. 虚拟机+Ubuntu+filezilla连接
  9. LaTeX中巨算符下面输入两行内容的方法
  10. LeetCode-1052:爱生气的书店老板