利用栈实现四则运算

import java.util.*;
public class Main {
    static Set<Character> brace = new HashSet<Character>();
   public static void main(String[] args) {
      Scanner cin = new Scanner(System.in);
      brace.add('{');
      brace.add('[');
      brace.add('(');
      //输入格式做处理
      String exp =cin.nextLine().replaceAll("(?<![0-9)}\\]])(?=-[0-9({\\[])","0")+"#";
      System.out.println(caclute(exp));
  }    
   private static int caclute(String exp){
      Stack<Integer> opStack = new Stack<Integer>();
      Stack<Character> otStack = new Stack<Character>();
      String num ="";//
      for(int i=0;i<exp.length();i++){
          //提取字符
         char c = exp.charAt(i);
         //如果是数字
         if(Character.isDigit(c)){
             num+=c;
         }else{  //如果不是数字
             if(!num.isEmpty()){
                 //如果字符串不为空,数字入栈 ,并清空
                int n = Integer.parseInt(num);
                num="";
                opStack.push(n);
             }
             //如果遇到"#" 退出循环
             if(c=='#'){
                break;
             }else if(c=='+' || '-'==c){
                 //如果是空栈 后者栈顶是左括号,则入栈
                 if(otStack.isEmpty() || brace.contains(otStack.peek())){
                      otStack.push(c);
                 }else {
                     //否则一直弹栈计算,直到栈为空,或者遇到正括号 再入栈
                      while(!otStack.isEmpty() && !brace.contains(otStack.peek())){
                          popAndCal(opStack,otStack);
                      }
                      otStack.push(c);
                 }
                
                
             }else if('*'==c || '/'==c){
                  //栈空 或者栈顶运算符优先级低 或者 栈顶为正括号
                 if(otStack.isEmpty() || otStack.peek()=='+' ||otStack.peek()=='-' || brace.contains(otStack.peek())){
                       otStack.push(c);
                 }else {
                    //否则一直做弹栈运算 直到遇到"*" 或者'/' 或者正括号 最后入栈
                    while(!otStack.isEmpty() && !(otStack.peek()=='+') &&!(otStack.peek()=='-') && !brace.contains(otStack.peek())){
                         popAndCal(opStack, otStack);
                    }
                     otStack.push(c);
                    
                 }
                
             }else {
                
               //如果是正括号就入栈
                 if(brace.contains(c)){
                    otStack.push(c);
                 }else{//如果是反括号 则一直出栈计算 直到遇到正括号为止
                     char r = getBrace(c);
                     while(otStack.peek()!=r){
                        popAndCal(opStack, otStack);
                     }
                     //最后弹出正括号
                     otStack.pop();
               
                    
                 }
                
             }
            
         }
      }
      while(!otStack.isEmpty()){
        popAndCal(opStack, otStack) ;
      }
      return opStack.pop();
       
     }
private static char getBrace(char c) {
     switch(c){
     case '}':
          return '{';
     case ']':
         return '[';
     case ')':
         return '(';
     }
    
    return '#';  
}
private static void popAndCal(Stack<Integer> opStack, Stack<Character> otStack) {
      int op2 = opStack.pop();
      int op1 = opStack.pop();
      char ot = otStack.pop();
      int res =0;
      switch(ot){
      case'+':
         res = op1+op2;
         break;
      case'-':
          res = op1-op2;
          break;
      case'*':
          res = op1*op2;
          break;
      case'/':
          res = op1/op2;
          break;
      }
    opStack.push(res);
   
 }
}     


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值