最近在看《算法》这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题。

import java.util.*;
/*
*
* 用来计算表达式
* for example: 1+2*3*(4+3*1)-3*1+2+3/1;
* (1+2*2-2*1*3*(1-1))*(1-2+3*(4+0));
* 注意点:
* 2.输入的表达书不能还有空格,括号必须匹配
* 基本思想:
* 1.建立操作数栈以及操作符栈
* 2.先去括号,每次遇到')'时,就退栈,直到遇到'('
* 3.然后处理括号中的表达式,先处理优先级高的,即*、/
* 4.处理好高优先级操作符之后,就处理+、-这种操作符
* 5.对以上的运算结果入栈,继续,处理完所有的(、)之后
* 6.然后再次求一般的表达式即可
*/ public class CalExpression { private Stack<Double > vals = new Stack<Double >();
private Stack<Character > ops = new Stack<Character >(); public static void main(String[] args) {
CalExpression obj = new CalExpression();
obj.input();
} public void input() {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
pushStack(in.next());
}
} public boolean check(char ch) {
if (ch == '(' || ch == ')' || ch == '+' || ch == '-'
|| ch == '*' || ch == '/') {
return true;
}
return false;
} public void pushStack(String str) {
//匹配非数字,将(、)、+、-、*、/作为分隔符
String[] strNum = str.split("[^0-9]"); Queue<Double > que = new LinkedList<Double >(); for (int i = 0; i < strNum.length; ++i) {
if (!strNum[i].equals("")) {
que.offer(Double.parseDouble(strNum[i]));
}
} boolean flag = false;
for (int i = 0; i < str.length(); ++i) {
if (check(str.charAt(i))) {
//匹配到右括号,需要计算括号中的内容
if (str.charAt(i) == ')') {
Deque<Character > ops_tmp = new LinkedList<Character >();
while (!ops.isEmpty() && ops.peek() != '(') {
ops_tmp.offerFirst(ops.pop());
}
//'('退栈
ops.pop();
calExpress(ops_tmp);
} else {
ops.push(str.charAt(i));
}
flag = false; } else if (!flag) {
vals.push(que.poll());
flag = true;
}
} double value = getValue(vals.iterator(), ops.iterator()); System.out.println(value);
vals.clear();
ops.clear(); } public void calExpress(Deque<Character > deq_ops) {
//操作数数目=操作符数目+1
int numCount = deq_ops.size() + 1; Deque<Double > deq_num = new LinkedList<Double >();
while (numCount > 0 && !vals.isEmpty()) {
deq_num.offerFirst(vals.pop());
numCount--;
} double value = getValue(deq_num.iterator(), deq_ops.iterator());
vals.push(value);
} public double getValue(Iterator it_num, Iterator it_ops) {
Deque<Double > vals = new LinkedList<Double >();
Deque<Character > ops = new LinkedList<Character >(); vals.offer((double)it_num.next());
while (it_num.hasNext()) {
char ch = (char)it_ops.next();
if (ch == '+' || ch == '-') {
vals.offer((double)it_num.next());
ops.offer(ch);
} else if (ch == '*' || ch == '/') {
double num = vals.pollLast();
if (ch == '*') {
vals.offer(num * (double)it_num.next());
} else {
vals.offer(num / (double)it_num.next());
}
}
} double value = vals.pollFirst();
while (!vals.isEmpty() && !ops.isEmpty()) {
if ((char)ops.pollFirst() == '+') {
value += vals.pollFirst();
} else {
value -= vals.pollFirst();
}
} return value;
} }

Java集合框架练习-计算表达式的值的更多相关文章

  1. Lambda表达式和Java集合框架

    本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...

  2. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  3. Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法

    今天项目中碰到一个以前从没有见过的异常信息“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”,于是查了一下资料,原来此异常是由于我在代码中使用了"Response.End ...

  4. 异常:Data = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    做项目的时候,将DataTable序列化成Json,通过ashx向前台返回数据的时候,前台总是获取不到数据,但是程序运行却没问题, 没抛出异常.一时找不到办法,减小输出的数据量,这时前台可以接收到页面 ...

  5. C# 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。这个错误是什么原因引起的?

    C# 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值.这个错误是什么原因引起的? 2011-12-17 22:45 提问者: 匿名|浏览次数:6056次 我来帮他解答 图片 符号 ...

  6. 【.NET】由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    前言 上段时间做项目时,遇到如题之类问题,如今过去有一段时间了,具体出现的情形忘了,当时虽然找到了解决方法,但是依旧没有弄明白出现此种情况是何种原因,后来在微软的帮助支持中心找到了答案,特此记录,以防 ...

  7. 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。System.Threading.ThreadAbortException

    第一次遇到这样的错误 错误语法 try{ Response.Redirect("aa.aspx"); }catch (Exception ex){ Response.Redirec ...

  8. 【转】Java集合框架面试问题集锦

    Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题.很好地理解集合框架,可以帮助你理解和利用Java的一些高级特性.下面是面试Java核心技术的一些很实用的问题. Q:最常见的 ...

  9. Java中的函数式编程(五)Java集合框架中的高阶函数

    写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程.   本文的 ...

随机推荐

  1. 一道Apple公司(中国)的面试题目

    Apple在中国(上海)有公司业务,但是感觉主要是做测试工作的部门,主要是保障Apple的产品质量QE.面试的时候,面试官出了一道题目,我貌似曾今开过类似的题目,但是由于当场发挥不佳没有答出来.题目大 ...

  2. Linux系统启动过程

    1. 从BIOS到KERNEL BIOS自检->MBR(GRUB)->KERNEL->KERNEL自解压->内核初始化->内核启动 BIOS自检 当电脑开机的时候,电脑会 ...

  3. 我们为什么要看《超实用的Node.JS代码段》

    不知道自己Node.JS水平如何?看这张图 如果一半以上的你都不会,必须看这本书,一线工程师用代码和功能页面来告诉你每一个技巧点. 都会一点,但不知道如何检验自己,看看本书提供的面试题: 1.     ...

  4. 如何安装 第三方 Go 离线包? (GOPATH、 go install)

    有时候 go get 比较慢,可以考虑用迅雷等下载工具下载下来,然后再本地安装, 如:code.google.com/p/go.net/websocket,如何安装这些离线包? 先在你的 GOPATH ...

  5. Android:控件AutoCompleteTextView 自动提示

    在文本框中输入,要这样的提示效果,如果你输入的是aac,在输入aa后,选择aac,文本框的内容会自动补齐,输入aac(类似百度搜索文本框的显示结果)   <AutoCompleteTextVie ...

  6. C++ 操作XML文件 使用MSXML.DLL

    使用MSXML.DLL读写XML; 文件顶部加入 #import "msxml3.dll"; using namespace MSXML2; //这两句作用是,在程序的文件夹下生成 ...

  7. 安装Axure7.0,完整教程,有验证码和汉化包

    以下内容由Axure中文网 » Axure7.0中文汉化语言包下载 axure汉化包 改编,特此声明 1.下载安装包 官方下载页面: http://www.axure.com/download 官网直 ...

  8. Linux学习之四--Nginx

    关于Nginx的 nginx的是一个高性能的Web服务器的软件.它比Apache HTTP服务器更加灵活,重量轻的程序. 本教程将教你如何安装和你的CentOS 7服务器上启动Nginx的.   先决 ...

  9. python界面

    import easygui as g import sys while 1: g.msgbox("我一定要学会编程!","加油!") #choices = [ ...

  10. Activity系列讲解---数据传递

    在Android中,不同的Activity实例可能运行在一个进程中,也可能运行在不同的进程中.因此需要一种特别的机制帮助我们在Activity之间传递消息.Android中通过Intent对象来表示一 ...