题目描述
请实现如下接口
/* 功能:四则运算
* 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"
* 返回:算术表达式的计算结果
*/
public static int 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();
}
}