复习数据结构,用java栈写了个计算器

为了提高运算效率,计算机采用更易识别的后缀表达式,基于栈进行运算
代码前半部分计算后缀表达式,后半部分对后缀表达式进行运算,原理太多了,不解释
 
  
import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern;
public class test {
 public static void main(String[] args) {   Scanner scan = new Scanner(System.in);   String str=scan.nextLine();   String regex = "(?<=\\d)-{1}|(?<=\\))-{1}|[+*/()]{1}|-?\\d+";//-在[]中要转义,-数字的,数字-是减号,)-是减号   //String regex = "(?<=\\d)-(?=\\d){1}";   String[] strs = str.split(regex);   Pattern p = Pattern.compile(regex);   Matcher m = p.matcher(str);   List start=new ArrayList();//最初的表达式解析   while (m.find()) {    start.add(m.group());   }      System.out.println(start);      //char[] cs = str.toCharArray();   //8-9+1   //89-1+   //(7+8)--9   //7 8 + -9 -   //8+(9--7)*2   //8 9 -7 - 2 * +   Stack sta1 = new Stack<>();//利用出栈进行简单运算   List list=new ArrayList<>();//存后缀表达式   Stack sta2 = new Stack<>();//存字符,利用出栈操作调整顺序//压入栈时前面有减号后面加号变负   for (String c : start) {    if(c.matches("-?\\d+")) {     list.add(c);    }else if(sta2.isEmpty()){     sta2.push(c);    }else if(c.equals("+")||c.equals("-")){//三种优先级     if(sta2.peek().equals("(")||sta2.isEmpty()) {//其他情况均弹出原栈顶再压入它      sta2.push(c);     }else {      list.add(sta2.pop());      sta2.push(c);     }    }else if(c.equals("*")||c.equals("/")) {     if(sta2.peek().equals("(")||sta2.isEmpty()||sta2.peek().equals("+")||sta2.peek().equals("-")) {//其他情况均弹出原栈顶再压入它      sta2.push(c);     }else {      list.add(sta2.pop());      sta2.push(c);     }         }else if(c.equals("(")) {//压入栈等')'     sta2.push(c);    }else if(c.equals(")")) {     while(!sta2.isEmpty()) {     if(sta2.peek().equals("(")) {      sta2.pop();//弹出但不加入      break;     }else {      list.add(sta2.pop());     }     }    }    }
  while(!sta2.isEmpty()) {//把剩下的字符依次弹出   list.add(sta2.pop());   }   //list为后缀表达式   System.out.println(list);   //System.exit(0);   //把list压入栈中进行计算   for(int i=list.size()-1;i>=0;i--) {    sta1.push(list.get(i));   }   //System.out.println(sta1);   List list2=new ArrayList<>();   while(sta1.size()>0) {    if(sta1.peek().matches("-?\\d+")) {         list2.add(Integer.parseInt(sta1.pop()));    }else {     String a=sta1.pop();     if(a.equals("+")) {     list2.set(list2.size()-2,(list2.get(list2.size()-2)+list2.get(list2.size()-1)));     }else if(a.equals("-")){      list2.set(list2.size()-2,(list2.get(list2.size()-2)-list2.get(list2.size()-1)));     }else if(a.equals("*")) {      list2.set(list2.size()-2,(list2.get(list2.size()-2)*list2.get(list2.size()-1)));     }else if(a.equals("/")) {      list2.set(list2.size()-2,(list2.get(list2.size()-2)/list2.get(list2.size()-1)));     }     list2.remove(list2.size()-1);    }
  }   System.out.println(list2);  }
}

你可能感兴趣的:(复习数据结构,用java栈写了个计算器)