hdu 1237 Java 简单计算器

点击打开链接

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15204    Accepted Submission(s): 5188


Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

Sample Input
  
  
1 + 2 4 + 2 * 5 - 7 / 11 0
 

Sample Output
  
  
3.00 13.36
 

解题思路:

这题借鉴别人之后自己写的,因为刚学Java中的集合,不怎么会用

针对这题,数和符号分别用两个集合装,这题不仅仅只是用到集合中的栈,还用到队列,当运算乘除法时候,用到的是栈(先算乘除两边的数,然后用结果取代数的位置,方便后面的加减法运算),加减法的时候用到的是队列

(直接从头到尾一起运算)

package cn.hncu.acm;

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);
			while(sc.hasNext()){
				String a=sc.nextLine();
				if(a.compareTo("0")==0){
					break;
				}
				
				String ss=a.replaceAll(" ", ",");
				String[] str=ss.split(",");
				
				LinkedList<String > signlink=new LinkedList<String>();//用来放符号
				LinkedList<Double>  numlink=new LinkedList<Double>();//用来放数
				double sum=0.0;
				double sum1=0.0;
				//从题目中知道输入的数都是规则的,i是数,那么i+2肯定是数。
				for(int i=0;i<str.length;i++){
					if((i+1)%2==0){//偶数都是符号
						if(str[i].compareTo("*")==0){
						sum=numlink.getLast()*Double.parseDouble(str[i+1]);
						}else if(str[i].compareTo("/")==0){//要是字符串为/,同样的算出结果
							sum=numlink.getLast()/Double.parseDouble(str[i+1]);
						}else{
							signlink.add(str[i]);//仅仅只是添加符号,就不用下面的添加
							continue;
						}
						numlink.pollLast();//移除现在最后加进去的数,因为做了运算,应该用这个结果去代替
						i=i+1;//因为当符合条件后,如 a*b+c,当i的位置知道*时候,把c也计算了,所以需要+1;
						numlink.add(sum);
					}else{
						numlink.add(Double.parseDouble(str[i]));//第一个数不满足就会放进数的队列;
					}
				}
//				for(int i=0;i<signlink.size();i++){
//					if(str[i].compareTo("+")==0){
//						sum1=(numlink.pollFirst()+Double.parseDouble(str[i+1]));
//						i=i+1;
//					}else{
//						sum1=(numlink.pollFirst()-Double.parseDouble(str[i+1]));
//						i=i+1;
//					}
//					i=i+1;
//					numlink.add(sum1);
//				}
//				
//				Iterator<Double> it =numlink.iterator();
//				while(it.hasNext()){
//					sum1=sum1+it.next();
//				}
//				System.out.println(sum1);
//			}
			sum1=numlink.pollFirst();	
			while(!signlink.isEmpty()){
				String sign=signlink.pollFirst();
				if(sign.compareTo("+")==0){
					sum1+=numlink.pollFirst();
				}else{
					sum1-=numlink.pollFirst();
				}
			}
			
			System.out.printf("%.2f",sum1);
			System.out.println();
			
			}
	}

}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值