hdu1237(简单计算器) LinkedList类实现栈和队列功能
来源:互联网 发布:中兴蓝剑计划 知乎 编辑:程序博客网 时间:2024/06/07 10:01
点击打开链接
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 24 + 2 * 5 - 7 / 110
Sample Output
3.0013.36
思路:用两个集合来分别存放符号和数字,之所说集合是因为在存放和计算时,即用到了队列,也用到了栈的思想,所以单独的说用哪个都不准确。
具体操作:在存符号时,若遇见乘或者除,则直接用这个符号计算其两边的数,这就需要将数字集合中的最后一个进入的数拿出来,也就是后进先出(栈),然后将结果在放入数字栈中,经过这样的处理,全部放完后,就相当于只有加减两个运算
的式子了,这样就可以用队列思想,先进先出,一次按顺序计算即可。
实现代码:
package collection;import java.util.Iterator;import java.util.LinkedList;import java.util.Scanner;public class P1237 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);String str;String[] strs;while(sc.hasNext()){str=sc.nextLine();//这里要用nextLineif(str.compareTo("0")==0){break;}strs=str.split(" ");//然后通过split用空格将所有的数字和符号分开//for(int i=0;i<strs.length;i++){//System.out.print(strs[i]);//}//System.out.println();LinkedList<Double> numQue=new LinkedList<Double>();//创建两个链表集合,既可以当做栈来运行,又可以当做队列来运算LinkedList<String> signQue=new LinkedList<String>();double mid=0.0;for(int i=0;i<strs.length;i++){if((i+1)%2==0){//因为题目说了是规范的式子,所有偶数一定是符号,奇数就是数字if(strs[i].compareTo("*")==0){//若是乘除符号,则将从数字栈中取出一个数,与下一将要存放的数字继续对应的运算mid=numQue.getLast()*Double.parseDouble(strs[i+1]);}else if(strs[i].compareTo("/")==0){mid=numQue.getLast()/Double.parseDouble(strs[i+1]);}else{//若不是,则入队列signQue.add(strs[i]);continue;}//System.out.println(strs[i]+mid);i=i+1;//若是乘除,因为下一个已经做了运算,所以可以直接跳到下二个,也就是下一个符号numQue.pollLast();numQue.add(mid);//用乘除相邻的两个数代替下一个数,所以让i=i+1}else{numQue.add(Double.parseDouble(strs[i]));//否则数字入队}}//Iterator<Double> it=numQue.iterator();//while(it.hasNext()){//System.out.print(it.next()+" ");//}//Iterator<String> it2=signQue.iterator();//while(it2.hasNext()){//System.out.print(it2.next()+" ");//}double result=numQue.pollFirst();//因为放完后,符号队列一定比数字队列少一个,所以先拿出一个数字String sign;while(!signQue.isEmpty()){//然后让符号出队,同时让数子也出队,直到为空sign=signQue.pollFirst();if(sign.compareTo("+")==0){result+=numQue.pollFirst();}else{result-=numQue.pollFirst();}}System.out.printf("%.2f",result);System.out.println();}}}
2 0
- hdu1237(简单计算器) LinkedList类实现栈和队列功能
- hdu1237简单计算器-栈实现
- 栈 hdu1237 简单计算器
- hdu1237简单的计算器(栈)
- hdu1237 简单计算器 (模拟+栈)
- 简单计算器 java实现hdu1237
- 简单计算器 hdu1237(模拟栈)
- hdu1237简单计算器(栈的简单运用)
- HDU1237 简单计算器 【栈】+【逆波兰式】
- 【栈/中缀转后缀】HDU1237简单计算器
- hdu1237 简单计算器
- HDU1237:简单计算器
- hdu1237简单计算器
- hdu1237简单计算器
- HDU1237简单计算器
- hdu1237 简单计算器
- hdu1237-简单计算器
- HDU1237 简单计算器
- Android学习之图片压缩,压缩程度高且失真度小
- 黑马程序员 String类
- poj 3436 ACM Computer Factory (最大流)
- 为什么我照书写的win32程序在vs上编译不了?
- HDU 2095 find your present (2)
- hdu1237(简单计算器) LinkedList类实现栈和队列功能
- Codeforces Round #316 (Div. 2)
- Linux脚本重定向
- Linux服务器同步时间
- 码农《七》
- 《C++核心思想》学习笔记(4)
- Android Ion用户空间和内核空间
- HDU 5382 GCD?LCM!
- 向文件写入127个ASCLL码,这程序是什么回事不行