题目描述

请写一个整数计算器,支持加减乘三种运算和括号。

示例2

输入

"(2*(3-4))*5"

返回值

-10

运算符号有优先级,所以使用单调栈可以解决改问题。如下代码,效率比较低,后面优化。

import java.util.Stack;public class AlgoSolveMe {public static void main(String[] args) {String s = "(2*(3-4))*5";//s="100+100";//s = "((10+2)*10-(100-(10+20*10-(2*3)))*10*1*2)-2";  // 2198AlgoSolveMe algoSolveMe = new AlgoSolveMe();System.out.println(algoSolveMe.solve(s));}/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 返回表达式的值* @param s string字符串 待计算的表达式* @return int整型*/public int solve (String s) {// "(2*(3-4))*5"Stack<Integer> opValue = new Stack<>();Stack<Character> opSign = new Stack<>();/*((10+2)*10-(100-(10+20*10-(2*3)))*10*1*2)-2(120-(100-(10+20*10-6))*10*1*2)-2(120-(100-204)*10*1*2)-2(120-(-104)*10*1*2)-2(120-(-2080))-22200-2 = 2198*/String temp = "";for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if(ch == '('){opSign.push(ch);}else if((ch == '*'|| ch == '/' || ch == '+'|| ch == '-') ) {if(opSign.isEmpty() || opSign.peek()=='(') {opSign.push(ch);}else if(ch == '+' || ch == '-'){while(!opSign.isEmpty() && opSign.peek() != '(') {doOper(opValue, opSign);}opSign.push(ch);}else if((ch == '*' || ch == '/') && (opSign.peek()=='+' || opSign.peek()=='-') ){opSign.push(ch);}else if(ch == '*' || ch == '/'){while(!opSign.isEmpty() && opSign.peek() != '(' && opSign.peek()!='+' && opSign.peek()!='-') {doOper(opValue, opSign);}opSign.push(ch);}}else if(ch == ')') {while(opSign.peek() != '(') {doOper(opValue, opSign);}// 弹出右边括号opSign.pop();}else{temp += ch;for (int j = i+1; j < s.length(); j++) {// 判断是否为连续的字符是不是数字if(s.charAt(j)<48 || s.charAt(j)>57) {break;}i++;temp += s.charAt(j);}opValue.push(Integer.valueOf(temp));temp= "";}}while(!opSign.isEmpty()){doOper(opValue, opSign);}return opValue.peek();}private void doOper(Stack<Integer> opValue,Stack<Character> opSign){int op1=0,op2=0;op2 = opValue.pop();op1 = opValue.pop();char ops = opSign.pop();int res = 0;if (ops == '-') {res = op1 - op2;} else if (ops == '+') {res = op1 + op2;} else if (ops == '*') {res = op1 * op2;} else if (ops == '/') {res = op1 / op2;}opValue.push(res);}
}

常考数据结构与算法:表达式求值相关推荐

  1. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  2. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  3. java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)

    数据结构之后缀表达式求值(java实现) 前记 ​ 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...

  4. c语言程序设计报告表达式求值,数据结构 课程设计表达式求值 实验报告

    <数据结构 课程设计表达式求值 实验报告>由会员分享,可在线阅读,更多相关<数据结构 课程设计表达式求值 实验报告(21页珍藏版)>请在人人文库网上搜索. 1.实验课程名称 级 ...

  5. c语言表达式的算法,表达式求值--数据结构C语言算法实现

    这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...

  6. linux算术表达式求值数据结构,数据结构:算数表达式求值演示

    题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...

  7. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

  8. 常考数据结构与算法:求平方根

    题目描述 实现函数 int sqrt(int x). 计算并返回x的平方根(向下取整) 思路: 利用平方数的性质.连续n个奇数相加的结果一定是平方数.例如: 9 = 1+3+5 , 一共3个奇数相加, ...

  9. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

最新文章

  1. [译]GPU加持,TensorFlow Lite更快了
  2. 10 个平板电脑上的 Python 编辑器
  3. ASP.NET MVC3 中设置htmlAttribute
  4. Java多线程并发编程
  5. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性介绍(3)- 命名规则
  6. scrapy 处理动态加载,使用phantomjs
  7. c语言程序设计新教材,《C语言程序设计》教学大纲(新)教材.doc
  8. Unity3d C# Socket 下载文件 (同步到)
  9. 微信公众号开发文档参考
  10. AcWing 790 数的三次方根
  11. An error occurred.Faithfully yours, nginx
  12. Android系统开启蓝牙源码分析(上)
  13. Nginx配置双重用户认证
  14. java gui 日历_Java实现简单日历小程序 Java图形界面小日历开发
  15. WSO2 Business Process Server(WSO2 BPS)使用简易教程
  16. 演讲达人成长记作者1月26日在西单图书大厦做讲座
  17. google 天气rss
  18. Android_Studio
  19. 4000多家沪深上市公司专利数据库(2010-2021年)
  20. android录制avi视频时aac音频的正确配置方法

热门文章

  1. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
  2. 《C程序设计语言》- 字符输入和输出
  3. Lua的清屏快捷方式
  4. whereis命令查看你要添加的软件在哪里
  5. 【转载】C#中StreamReader读取中文文本出现乱码的解决方法
  6. 用 TS + Vue 写了一个在 Chrome 中运行 Prettier 格式化的扩展程序
  7. Linux内存buffer和cache的区别
  8. 如何有效实现软件的需求管理(6)
  9. 通过Nginx,Tomcat访问日志(access log)记录请求耗时
  10. Ollydbg 中断方法浅探