Problem Description
Input
Output
Sample Input
Sample Output
思路:用兩個集合來分別存放符號和數字,之所說集合是因爲在存放和計算時,即用到了隊列,也用到了棧的思想,所以單獨的說用哪個都不準確。
具體操作:在存符號時,若遇見乘或者除,則直接用這個符號計算其兩邊的數,這就需要將數字集合中的最後一個進入的數拿出來,也就是後進先出(棧),然後將結果在放入數字棧中,經過這樣的處理,全部放完後,就相當於只有加減兩個運算
的式子了,這樣就可以用隊列思想,先進先出,一次按順序計算即可。
實現代碼:
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();
}
}
}