简单计算器
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();
}
}
}