hdu 1237 Java 簡單計算器

YX_blog發表於2015-08-18

點選開啟連結

簡單計算器

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();
			
			}
	}

}


相關文章