hdu1237(簡單計算器) LinkedList類實現棧和隊列功能

點擊打開鏈接

Problem Description

讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。
 

Input

測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。
 

Output

對每個測試用例輸出1行,即該表達式的值,精確到小數點後2位。
 

Sample Input

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


Sample Output

3.00 13.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();//這裏要用nextLine
			if(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();
		}
	}

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章