问题描述:

对于任意字符串,包含+ - * /和括号, 求出该表达式的值

首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如:

-1+(-2)*3       遇到负号怎么办?

现贴出代码如下:

  1 package calcultor;
  2
  3 import java.util.Stack;
  4
  5 public class Calcultor {
  6
  7     static boolean isNumber(char x) {
  8         if (x >= '0' && x <= '9') {
  9             return true;
 10         }
 11         return false;
 12     }
 13
 14     static int priority(char x) {
 15         if (x == '+' || x == '-') {
 16             return 0;
 17         } else if (x == '*' || x == '/') {
 18             return 1;
 19         } else if (x == '(' || x == ')') {
 20             return -1;
 21         } else if (x == '#') {
 22             return -2;
 23         }
 24
 25         return -3;
 26     }
 27
 28     public static int calculte(String s) {
 29         Stack<Integer> number = new Stack<Integer>();
 30         Stack<Character> operate = new Stack<Character>();
 31         char top;
 32         int a = 0, b = 0;
 33         int j = 0;
 34         boolean flag = false;
 35         for (int i = 0; i < s.length(); ++i) {
 36             if (s.charAt(1) == '-') {
 37                 flag = true;
 38             }
 39             if (i >= 2 && i <= s.length() - 2) {
 40                 j = i;
 41                 if (!isNumber(s.charAt(j - 1)) && s.charAt(i) == '-' && isNumber(s.charAt(j + 1))) {
 42                     flag = true;
 43                 }
 44             }
 45             if (isNumber(s.charAt(i))) {
 46                 int Temp = 0;
 47                 String temp = "";
 48                 temp += s.charAt(i);
 49                 while (isNumber(s.charAt(++i)))
 50                     temp += s.charAt(i);
 51                 for (int jj = 0; jj < temp.length(); ++jj) {
 52                     Temp = Temp * 10 + temp.charAt(jj) - 48;
 53                 }
 54                 if (flag) {
 55                     Temp *= -1;
 56                     flag = !flag;
 57                 }
 58                 number.push(Temp);
 59                 temp = null;
 60             }
 61             if (!isNumber(s.charAt(i))) {
 62                 if (((s.charAt(i) == '-') && !flag) || (s.charAt(i) != '-')) {
 63                     if (operate.empty()) {
 64                         operate.push(s.charAt(i));
 65                     } else {
 66                         top = operate.peek();
 67                         if (priority(s.charAt(i)) > priority(top) || s.charAt(i) == '(') {
 68                             operate.push(s.charAt(i));
 69                         } else {
 70                             while (priority(s.charAt(i)) <= priority(top)) {
 71                                 if (top == '#' && s.charAt(i) == '#') {
 72                                     int answer;
 73                                     operate.pop();
 74                                     answer = number.peek();
 75                                     number.pop();
 76                                     return answer;
 77                                 } else if (top == '(' && s.charAt(i) == ')') {
 78                                     ++i;
 79                                 } else {
 80                                     a = number.peek();
 81                                     number.pop();
 82                                     b = number.peek();
 83                                     number.pop();
 84                                 }
 85                                 if (top == '+') {
 86                                     b += a;
 87                                     number.push(b);
 88                                 } else if (top == '-') {
 89                                     b -= a;
 90                                     number.push(b);
 91                                 } else if (top == '*') {
 92                                     b *= a;
 93                                     number.push(b);
 94                                 } else if (top == '/') {
 95                                     b /= a;
 96                                     number.push(b);
 97                                 }
 98                                 operate.pop();
 99                                 top = operate.peek();
100                             }
101                             operate.push(s.charAt(i));
102                         }
103                     }
104                 }
105             }
106         }
107
108         return 0;
109     }
110
111     public static void main(String[] args) {
112         String s = new String("#(1+2)+6/3+(-2*2)+(-2*6)#");
113         int answer = calculte(s);
114         System.out.println("the answer is " + answer);
115     }
116 }

转载于:https://www.cnblogs.com/lifeng-blog/p/7407043.html

java栈实现简易计算器算法相关推荐

  1. 数据结构:栈实现简易计算器

    文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...

  2. (C语言)栈应用简易计算器实现

    //利用栈实现简易计算器,进行包含+,-,*,/,(,)间的计算 #include<stdio.h> #include<string.h> #define MaxSize 10 ...

  3. java awt 简单计算器,JAVA Swing 开发简易计算器(上)

    开发一个简易的计算器我们主要分为两大部分:图形界面设计与具体功能实现.这篇文章讲图形界面设计,下篇讲具体功能实现. 代码下载:https://github.com/taifus/Java_Calcul ...

  4. Java编写的简易计算器

    一般来说,刚开始学习Java比较适合做一些小的东西,比如计算器.图书管理系统什么的,这样会学的稍微快一些.而我这个计算器正适合新手参考,为什么?因为我也是新手.虽说代码比较烂,但是很- 我先说下大致思 ...

  5. JAVA制作的简易计算器——傻瓜计算器

    用JAVA编写的傻瓜计算器 作用: 1.可以实现加法.减法.乘法.除法简单运算且是单一运算,不可混合使用. 2.CE为清除键 3.没有小数点O(∩_∩)O 思路: 创建JFrame窗口,设置标题,创建 ...

  6. 简易计算器 java_用Java做一个简易计算器,要用到哪些知识?

    分析问题关键词:Java.计算器 深夜无聊,暂且一答. 计算器分两个步骤:计算 + 器 篇一 ·「器」 在编程中,我们可以把「器」理解为「GUI(图形界面)」,Java 语言描绘的图形界面有很多种类, ...

  7. java简易计算器考察什么_练习:用java写一个简易计算器

    初学java中的选择,判断,循环和方法的概念,写一个简易的两位数计算器 思路推荐: 写4个方法:加减乘除 利用循环+switch进行用户交互 传递需要操作的两个数 输出结果 package com.j ...

  8. evaluate函数使用无效_[Python实战]使用栈实现简易计算器

    我们这次实现的命令行计算器,支持加减乘除.括号.浮点数.负数,以及查看历史和退出功能. 主要的思路:read - parse - print - loop. read 阶段是指读取用户在提示符(cal ...

  9. java编写计算器实现cancel_用Java编写的简易计算器

    在写代码的过程中,我意识到对于学习编程语言来说,比之看书,动手实践是更重要的. 通过写这个计算器程序,我掌握了一个java程序的基本构架,学会了用构造器进行初始化,使用监听器,设计界面等等知识. 这个 ...

最新文章

  1. 用计算机怎么算个人所得税,个税计算器2021
  2. 皮一皮:谁还不是个孩子...
  3. 七牛上传文件小工具v0.1
  4. richtextbox自动滚动到最下面_软网app:滚动截图将超长网页“一网打尽”
  5. C语言 | 指向指针的指针排序
  6. mybatis学习(25):分页3 多参数传递(使用map)
  7. @staticmethod和@classmethod的作用与区别
  8. 2020年,我靠Java加薪3倍工资,只因做对这件事
  9. Flutter 高级篇-所有知识点架构
  10. 西门子step7安装注册表删除_如何完全删除step 7
  11. uniapp scroll-view组件横向滚动不生效
  12. [散文]茶想(作者:王莹莹)
  13. 一个骗人的恶劣网站: GPS 定位好友 的传说 ( 其中一个域名是 ipl38.com 诈骗:利用手机号码GPS卫星追踪你的他(她)在什么位置
  14. 增益和偏移的概念_2 理解与校准 ADC 系统的偏移和增益误差
  15. 基于CORBA规范的中间件——CORBA基本原理
  16. 两位数求和(xhh)
  17. Kubernetes----Job控制器
  18. 树莓派mqtt连接onenet平台实现消息订阅与发布
  19. 大数据分析案例-基于决策树算法构建世界杯比赛预测模型
  20. 埃克塞特大学招收医学图像博士生

热门文章

  1. jquery通过数值改变球大小
  2. 转载:SVN插件的手动安装
  3. Android apk签名方法
  4. 在新建android工程的时候出现This template depends on the Android Support library!
  5. AndroidManifest.xml中Activity ConfigChanges属性的用法
  6. Android 对okhttp的封装
  7. Linux(内核和用户态的)动态内存管理
  8. Android控制手机振动相关
  9. Android 点击应用外的Url拉起应用
  10. AT2672 Coins