表达式求值(java)
今天去面试,考了这个,短时间没想出来。。。
太笨了!
后来想用栈和递归做
但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了。
- import java.util.Scanner;
- import java.util.Stack;
- public class ExpressionCalc {
- private Stack<Character> cStack = new Stack<Character>();
- private Stack<Integer> iStack = new Stack<Integer>();
- // 符号等级
- static int cLevel(char c) {
- switch (c) {
- case '(':
- return 0;
- case '+':
- return 1;
- case '-':
- return 1;
- case '*':
- return 2;
- case '/':
- return 2;
- }
- return 0;
- }
- // 对栈进行运算
- private void dealStack() {
- char c = cStack.pop();
- int num1 = iStack.pop();
- int num2 = iStack.pop();
- switch (c) {
- case '+':
- iStack.push(num1 + num2);
- break;
- case '-':
- iStack.push(num1 - num2);
- break;
- case '*':
- iStack.push(num1 * num2);
- break;
- case '/':
- iStack.push(num1 / num2);
- break;
- }
- }
- // 返回str的表达式的值
- public int calc(char[] exp) {
- while (!cStack.isEmpty()) {
- cStack.pop();
- }
- while (!iStack.isEmpty()) {
- cStack.pop();
- }
- cStack.push('(');
- for (int i = 0; i < exp.length; i++) {
- if (exp[i] == ' ') {
- continue;
- } else if (exp[i] > '0' && exp[i] <= '9') {
- int num = exp[i] - '0';
- while (exp[i + 1] > '0' && exp[i + 1] < '9') {
- i++;
- num = num * 10 + exp[i] - '0';
- }
- iStack.push(num);
- } else if (exp[i] == '(') {
- cStack.push(exp[i]);
- } else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
- while (cLevel(exp[i]) < cLevel(cStack.peek())) {
- dealStack();
- }
- cStack.push(exp[i]);
- } else if (exp[i] == ')') {
- while (!cStack.peek().equals('(')) {
- dealStack();
- }
- cStack.pop();
- }
- }
- return iStack.pop();
- }
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- ExpressionCalc m = new ExpressionCalc();
- while (sc.hasNext()) {
- // 程序需要前后补一个括号
- System.out.println(m.calc((sc.nextLine() + ")").toCharArray()));
- }
- }
- }
表达式求值(java)的更多相关文章
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 逆波兰表达式求值 java实现代码
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 表达式求值--Java实现
/*将中缀表达式--转化为后缀表达式--属于栈的一种应用 *具体思路: *1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边 *2.操作符优先级比较--定义了方法 * 栈中优先级高:出栈存进字 ...
- 去空格的四则运算表达式求值-Java
笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- java实现算术表达式求值
需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...
- 奇怪的表达式求值 (java实现)
题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
随机推荐
- 整站下载工具Teleport Pro
http://zmingcx.com/download-tools-teleport-pro-full-stop.html Teleport Pro是一款功能强大的离线浏览器,不论规模多大的网站,只要 ...
- C#实现播放声音的方法
文章来自学IT网:http://www.xueit.com/html/2009-09/21_4598_00.html 在这里介绍使用C#实现播放声音的几种方法,都是利用组件等方法来实现的,有兴趣的话可 ...
- sklearn中xgboost模块中plot_importance函数(特征重要性)
# -*- coding: utf-8 -*- """ ######################################################### ...
- JUC组件扩展(一):FutureTask理解
一.概述 FutureTask包装器是一种非常便利的机制,同时实现了Future和Runnable接口. 类图如下: FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable ...
- atitit.atiHtmlUi web组件化方案与规范v1
atitit.atiHtmlUi web组件化方案与规范v1 1. 如何在现有html 标签基础上定义自己的组件1 2. 组件的构成与定义1 3. 组件的加载1 4. 组件css的加载2 5. 操作组 ...
- (1)Smali系列学习之Smali函数调用语句分析
一.函数调用smali中的函数和成员变量也分为两种,分别为 direct 和 virtual.两者的区别如下: 1.direct method 是指调用private方法.2.virtual meth ...
- 自定义textView的placeholder和边框
想实现的效果: // // LHQsuggestionViewCtrl.m // A13 - 设置 // // Created by vic fan on 16/6/23. // Copyri ...
- 兼容IE getElementsByClassName取标签
function getElementsByClassName(className,root,tagName) { //root:父节点,tagName:该节点的标签名. 这两个参数均可有可无 if( ...
- href中使用相对路径访问上级目录的方法
项目ProjectXXX目录如下: WebContent> hello.jsp Folder1> foo.jsp Folder2> foo2.jsp 在foo.jsp中访问hello ...
- SpringBoot+Shiro引起事务失效、错误原因、解决方法
一.问题今天发现用户注册的Service的事务并没有起到作用,再抛出一个RuntimeException后,并没有发生回滚,下面是调试步骤: 1.检查数据库的引擎是否是innoDB 2.启动类上是否加 ...