今天去面试,考了这个,短时间没想出来。。。

太笨了!

后来想用栈和递归做

但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了。

  1. import java.util.Scanner;
  2. import java.util.Stack;
  3.  
  4. public class ExpressionCalc {
  5.  
  6. private Stack<Character> cStack = new Stack<Character>();
  7. private Stack<Integer> iStack = new Stack<Integer>();
  8.  
  9. // 符号等级
  10. static int cLevel(char c) {
  11. switch (c) {
  12. case '(':
  13. return 0;
  14. case '+':
  15. return 1;
  16. case '-':
  17. return 1;
  18. case '*':
  19. return 2;
  20. case '/':
  21. return 2;
  22. }
  23. return 0;
  24. }
  25.  
  26. // 对栈进行运算
  27. private void dealStack() {
  28. char c = cStack.pop();
  29. int num1 = iStack.pop();
  30. int num2 = iStack.pop();
  31. switch (c) {
  32. case '+':
  33. iStack.push(num1 + num2);
  34. break;
  35. case '-':
  36. iStack.push(num1 - num2);
  37. break;
  38. case '*':
  39. iStack.push(num1 * num2);
  40. break;
  41. case '/':
  42. iStack.push(num1 / num2);
  43. break;
  44. }
  45. }
  46.  
  47. // 返回str的表达式的值
  48. public int calc(char[] exp) {
  49. while (!cStack.isEmpty()) {
  50. cStack.pop();
  51. }
  52. while (!iStack.isEmpty()) {
  53. cStack.pop();
  54. }
  55. cStack.push('(');
  56.  
  57. for (int i = 0; i < exp.length; i++) {
  58. if (exp[i] == ' ') {
  59. continue;
  60. } else if (exp[i] > '0' && exp[i] <= '9') {
  61. int num = exp[i] - '0';
  62. while (exp[i + 1] > '0' && exp[i + 1] < '9') {
  63. i++;
  64. num = num * 10 + exp[i] - '0';
  65. }
  66. iStack.push(num);
  67. } else if (exp[i] == '(') {
  68. cStack.push(exp[i]);
  69. } else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
  70. while (cLevel(exp[i]) < cLevel(cStack.peek())) {
  71. dealStack();
  72. }
  73. cStack.push(exp[i]);
  74. } else if (exp[i] == ')') {
  75. while (!cStack.peek().equals('(')) {
  76. dealStack();
  77. }
  78. cStack.pop();
  79. }
  80. }
  81. return iStack.pop();
  82. }
  83.  
  84. public static void main(String[] args) {
  85. Scanner sc = new Scanner(System.in);
  86.  
  87. ExpressionCalc m = new ExpressionCalc();
  88. while (sc.hasNext()) {
  89. // 程序需要前后补一个括号
  90. System.out.println(m.calc((sc.nextLine() + ")").toCharArray()));
  91. }
  92.  
  93. }
  94. }

表达式求值(java)的更多相关文章

  1. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  2. 逆波兰表达式求值 java实现代码

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  3. 表达式求值--Java实现

    /*将中缀表达式--转化为后缀表达式--属于栈的一种应用 *具体思路: *1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边 *2.操作符优先级比较--定义了方法 * 栈中优先级高:出栈存进字 ...

  4. 去空格的四则运算表达式求值-Java

    笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...

  5. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  6. java实现算术表达式求值

    需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...

  7. 奇怪的表达式求值 (java实现)

    题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...

  8. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  9. Java描述表达式求值的两种解法:双栈结构和二叉树

    Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...

随机推荐

  1. 采集音频和摄像头视频并实时H264编码及AAC编码

    转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ...

  2. C# 遍历Dictionary并修改其中的Value

    C#的Dictionary类型的值,知道key后,value可以修改吗?答案是肯定能修改的.我在遍历的过程中可以修改Value吗?答案是也是肯定能修改的,但是不能用For each循环.否则会报以下的 ...

  3. 企业信息系统集成框架(设计思路)C模式

    1.客户端.h文件 #pragma once #include<stdlib.h> //A程序员定义接口形式和调用模式 //初始化句柄 typedef int(*Init_Socket)( ...

  4. 关于Animator获取当前剪辑长度

    通常下意识的肯定用这个接口 GetCurrentAnimatorStateInfo().length 但是存在一个过渡动画的问题,具体看这篇:过渡动画的测试 所以当播新的状态时直接取动画时间,取到的就 ...

  5. wxpy学习

    准备工作 安装 pip install -U wxpy -i "https://pypi.doubanio.com/simple/" 通过python脚本来发送消息给好友 from ...

  6. 解决 Netbeans Ant: taskdef class org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs cannot be found

    你在用Netbeans(实际上是Ant)Clean and Build你的项目生成可执行文件(例如Windows下的exe文件)时候遇到报错 或者遇到这样的报错: The libs.CopyLibs. ...

  7. github 修改项目默认语言

    我们在提交到github上的项目有时候被识别成了其它的语言,非我们使用的语言,这个时候可以采取以下措施来强制将语言改成我们需要的语言 在项目中创建一个文件 .gitattributes 打开.gita ...

  8. Oracle 计算两个时间的差值

    有两个日期数据START_DATE,END_DATE,欲得到这两个日期的时间差(以天,小时,分钟,秒,毫秒):天:ROUND(TO_NUMBER(END_DATE - START_DATE))小时:R ...

  9. Oracle启动中,spfile.ora、init<SID>.ora、spfile<SID>.ora 这三个文件正确的先后顺序是什么?

    Oracle启动中,spfile.ora.init<SID>.ora.spfile<SID>.ora 这三个文件正确的先后顺序是什么? 解答:启动数据库,使用startup命令 ...

  10. 关于Jquery Ajax的用法

    今天简单描述一下Jquery Ajax的用法,和我在使用过程中的一些看法,仅供自己娱乐和大家参考值之用! Jquery Ajax的重要性不言而喻,只从Jquery面世之后,终于解救了像我这种既做前台又 ...