華為機試:四則運算(表示式求值)
阿新 • • 發佈:2019-01-25
題目描述
請實現如下介面
/* 功能:四則運算
* 輸入:strExpression:字串格式的算術表示式,如: "3+2*{1+2*[-4/(8-6)+7]}"
* 返回:算術表示式的計算結果
*/
publicstaticint calculate(String strExpression)
{
/* 請實現*/
return 0;
}
約束:
pucExpression字串中的有效字元包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。
pucExpression算術表示式的有效性由呼叫者保證;
輸入描述:
輸入一個算術表示式
輸出描述:
得到計算結果
import java.util.*; public class Main17V2 { public static void main(String[] args) { @SuppressWarnings("resource") Scanner scan=new Scanner(System.in); while(scan.hasNext()){ String s=scan.nextLine(); s=s.replaceAll("\\{", "("); s=s.replaceAll("\\[", "("); s=s.replaceAll("\\}", ")"); s=s.replaceAll("\\]", ")"); ArrayList<String> list=new ArrayList<>(); char[] c=s.toCharArray(); int i=0; while(i<c.length){ int k=0; while(k+i<c.length && c[i+k]>='0' && c[i+k]<='9'){ k++; } if(k!=0){ list.add(String.copyValueOf(c, i, k)); i=i+k; } else{ list.add(String.copyValueOf(c, i, 1)); i++; } } ArrayList<String> list1=new ArrayList<>(); for(int j=0; j<list.size(); j++){ if(list.get(j).equals("-")){ if(j==0){ list1.add("0"); } else{ if(list.get(j-1).equals("(")){ list1.add("0"); } } } list1.add(list.get(j)); } System.out.println(computeNum(list1)); } } public static String[] getPostfixExpression(ArrayList<String> list){ Stack<String> s1=new Stack<>(); Stack<String> s2=new Stack<>(); int i=0; while(i<list.size()){ if(list.get(i).equals("(")){ s2.add(list.get(i)); i++; continue; } if(list.get(i).equals("+") || list.get(i).equals("-")){ while(!s2.isEmpty() && !s2.peek().equals("(")){ s1.add(s2.pop()); } s2.add(list.get(i)); i++; continue; } if(list.get(i).equals("*") || list.get(i).equals("/")){ while(!s2.isEmpty() && (s2.peek().equals("*") || s2.peek().equals("/"))){ s1.add(s2.pop()); } s2.add(list.get(i)); i++; continue; } if(list.get(i).equals(")")){ while(!s2.isEmpty() && !s2.peek().equals("(")){ s1.add(s2.pop()); } s2.pop(); i++; continue; } s1.add(list.get(i)); i++; } while(!s2.isEmpty()){ s1.add(s2.pop()); } String[] c=new String[s1.size()]; for(int j=c.length-1; j>=0; j--){ c[j]=s1.pop(); } return c; } public static int computeNum(ArrayList<String> list){ String[] c=getPostfixExpression(list); Stack<Integer> s=new Stack<>(); for(int i=0; i<c.length; i++){ int t1, t2; if(c[i].equals("+")){ t1=s.pop(); t2=s.pop(); s.add(t2+t1); continue; } if(c[i].equals("-")){ t1=s.pop(); t2=s.pop(); s.add(t2-t1); continue; } if(c[i].equals("*")){ t1=s.pop(); t2=s.pop(); s.add(t2*t1); continue; } if(c[i].equals("/")){ t1=s.pop(); t2=s.pop(); s.add(t2/t1);//小數需要處理,本題都是整除的,如果不是整數的話,可以將棧中的元素型別修改為double型別的 continue; } s.add(Integer.parseInt(c[i])); } return s.pop(); } }