1 + 2 4 + 2 * 5 - 7 / 11 0
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(); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu1237(简单计算器) LinkedList类实现栈和队列功能
原文地址:http://blog.csdn.net/u011479875/article/details/47664493