Java集合框架练习-计算表达式的值

最近在看《算法》这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下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) {//操作数数目=操作符数目+1int 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;}}


转载于:https://www.cnblogs.com/wally/p/4477036.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Ecllipse

一、熟悉Eclipse 1.Eclipse是由IBM公司投资4000万美元开发的集成开发工具。它基于Java语言编写&#xff0c;并且是开放源代码的、可扩展的&#xff0c;也是目前最流行的Java集成开发工具之一。另外&#xff0c;IBM公司捐出Eclipse源代码&#xff0c;组建了Eclipse联盟&#xff…

怎么自学linux操作系统,linux操作系统好学吗_要学什么

描述linux操作系统的基础知识是比较好学的&#xff0c;但是需要我们通过大量地练习来牢记这些基础知识。Linux操作系统依靠其多用户和多任务、跨平台硬件支持、丰富的软件支持、可靠的安全性、良好的稳定性和完善的网络功能的优势吸引了众多用户&#xff0c;企业办公也逐渐使用…

JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!

如果您一直在Twitter上关注一些Java的关键人物&#xff0c;或者在Reddit上阅读了“新闻”&#xff0c;那么您一定不会错过Spring和JavaEE宣传人员之间热闹的“贱人之战”&#xff08;请原谅我的法语&#xff09;。 首先&#xff0c;于尔根霍勒&#xff08;JrgenHller&#xff…

编程技术交流

需要技术交流包含java:HTML&#xff0c; MySQL&#xff0c; Redis&#xff0c; Linux &#xff0c;Nginx &#xff0c;Tomcat &#xff0c; IntelliJ IDEA &#xff0c;SVN &#xff0c; Eclipse &#xff0c;Maven &#xff0c; RationalRose&#xff0c; Java SE&#xff0c;…

Convert Sorted Array to Binary Search Tree

https://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 解题思路&#xff1a; 回忆一下BST二叉搜索树的定义&#xff0c;他是这样一个二叉树&am…

visa linux 串口 通信,使用visa进行串口通信

最近因为项目的原因&#xff0c;都在研究上位机通信问题。这两个星期研究还是蛮多心得&#xff0c;下面就写写关于使用visa进行串口通信的内容LABVIEW软件LabVIEW 在仪器控制方面&#xff0c;还是很有优势的&#xff0c;把你仪器给你&#xff0c;读懂指令&#xff0c;然后估计半…

使用Sublime text总是弹出Unable to save...

用户设置添加&#xff1a; "atomic_save": false

POJ 2398 Toy Storage

这道题和POJ 2318几乎是一样的。 区别就是输入中坐标不给排序了&#xff0c;_|| 输出变成了&#xff0c;有多少个区域中有t个点。 1 #include <cstdio>2 #include <cmath>3 #include <cstring>4 #include <algorithm>5 using namespace std;6 7 struct…

linux ip forward不起作用,linux-ipforward实现

对于linux的数据包流向&#xff0c;大家应该是比较了解&#xff0c;如果还不是很了解&#xff0c;可以参考《OReilly.Understanding.Linux.Network.Internals.Dec.2005》&#xff0c;其中有一个图非常清楚的描述了数据包的流向。ip的数据包接收函数是ip_rcv()>ip_rcv_finish…

java常见的面试题

1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序C/S(Client/Server),客户端/服务端,桌面应用程序2.你所知道网络协议有那些? HTTP:超文本传输协议 FTP:文件传输协议 SMPT:简单邮件协议 TELNET:远程终端协议 POP3:邮件读取协议 3.Java都有…

java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置...

此类实现:输出一行数组数据&#xff0c;根据输入的下标&#xff0c;以下标位置为结束&#xff0c;将原数组分割成两组子数组。并交换两个子数组的位置&#xff0c;保持子数组中的元素序号不变.如:原数组为7,9,8,5,3,2 以下标3为分割点&#xff0c;分割为子数组一&#xff1a;7,…

linux共享磁盘给指定ip,linux想挂载通过ipsan协议推送上来的磁盘,两个ip共分配了21个未分区的盘,...

先安装iSCSI initiator以及iscsiadmiscsiadm是基于命令行的iscsi管理工具&#xff0c;提供了对iscsi节点、会话、连接以及发现记录的操作。iscsiadm的使用说明可以查看/usr/share/doc/iscsi-initiator-utils-6.2.0.742/README&#xff0c;也可以运行man iscsiadm或iscsiadm --h…

dto与dto相互转换_在DTO上

dto与dto相互转换通常使用DTO或数据传输对象 。 什么不是s&#xff1f; 众所周知&#xff0c;它们源自DDD&#xff08;域驱动设计&#xff09;。 在那里很有意义–域对象具有状态&#xff0c;身份和业务逻辑&#xff0c;而DTO仅具有状态。 但是&#xff0c;当今许多项目正在使用…

动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据...

动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据&#xff1a;由存储过程决定&#xff0c;如果编写的存储过程可以生成需要呈现的表格则直接绑定&#xff0c;否则要动态生成表格转载于:https://www.cnblogs.com/yzl495/p/4269571.html

【APICloud系列|1】华为应用市场 应用版权证书或代理证书怎么填

将apk上传到华为应用市场 首页提交的时候是没有问题的&#xff0c;但是第二次需要更新的时候发现多了一个必填的选项 我的应用被打回来啦&#xff0c;说明这个免责函需要要填写。今天公章还不在公司&#xff0c;还着急上线&#xff0c;不能准时上线就扣20%的工资。

Lambdas中的例外:有点混乱的优雅解决方案

考虑以下用于写入文件的功能&#xff1a; 该方法背后的想法是&#xff0c;以允许用户在不同的实施方式中通过InputStream的方法&#xff0c;以便writeToFile可以被称为例如用GZIPOuputStream &#xff0c; SnappyOuputStream &#xff08;快速压缩&#xff09;或简单的FileIn…

linux ub查看ftp安装,Linux Ubuntu 18.04 安装 FTP服务

安装更新数据源 : apt-get update安装FTP: sudo apt-get install vsftpd服务启动FTP服务: sudo service vsftpd startTip可以使用screen后台运行服务停止FTP服务: sudo service vsftpd stop查看FTP服务状态: sudo service vsftpd status配置新建用户新建/home/uftp目录作为用户…

图片上的文字怎么转换为word

图片上的文字怎么转换为word 很多软件因为自身技术不成熟所有对使用环境操作步骤等有诸多的要求&#xff0c;使得用户使用的时候很不方便。一般的ocr文字识别软件不能在win7系统中使用&#xff0c;有的时候要使用这个软件还要重装系统或是找一台xp系统的电脑&#xff0c;使用受…

【APICloud系列|2】上架安卓应用商店全套流程(小米应用商店、华为应用市场、阿里应用商店、百度手机助手、腾讯应用宝)

​​本次主要讲解前5个平台上架流程及注意事项(注册登录信息自行准备) 1. 腾讯应用宝:http://open.qq.com/ 2. 阿里应用商店(淘宝手机助手,UC应用商店,豌豆荚):http://open.uc.cn/ 3. 百度手机助手:http://app.baidu.com/ 4. 华为应用市场:http://developer.huaw…

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞&#xff0c;同步与异步 1. 概念理解 在进行网络编程时&#xff0c;我们常常见到同步(Sync)/异步(Async)&#xff0c;阻塞(Block)/非阻塞(Unblock)四种调用方式&#xff1a;同步&#xff1a; 所谓同步&#xff0c;就是在发出一个功能调用时&#xff0c;…