zoukankan      html  css  js  c++  java
  • 表达式计算

    问题描述

      输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
    输入格式
      输入一行,包含一个表达式。
    输出格式
      输出这个表达式的值。
    样例输入
    1-2+3*(4-5)
    样例输出
    -4
    数据规模和约定
      表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
     
      使用两个stack进行中缀表达式求解,一个存符号,一个放数据,数值可能是两位数或者多位数的,
    需要进行一些简单的处理,
    注意:当下一个运算符优先级大于栈顶符号的优先级时直接入栈,否则进行把栈顶运算符进行出栈,和
    数据进行计算,在计算时,两个操作数需要交换位置。java中stack栈顶元素是firstElement
     
    import java.lang.reflect.Array;
    import java.util.*;
    
    public class Main {
        private Scanner scanner;
        public static void main(String[] args) {
            new Main();
        }
    
        private Main(){
            scanner = new Scanner(System.in);
            solve();
    
        }
    
        private void solve(){
            String s = scanner.next();
            char [] ch = s.toCharArray();
    
            Stack<Integer> num = new Stack<>();
            Stack<Character> op = new Stack<>();
            int sum = 0;
            for(int i = 0;i<s.length();i++){
                if(Character.isDigit(ch[i])){
                    StringBuffer buffer = new StringBuffer();
                    i = index(ch,i,buffer)-1;
                    num.push(Integer.parseInt(buffer.toString()));
                }
                else {
                    if(ch[i] == '('){
                        op.push(ch[i]);
                    }
                    else if(ch[i] == ')'){
                        while (op.lastElement()!='('){
                            int a = num.pop();
                            int b = num.pop();
                            char sy = op.pop();
                            sum = computer(sy,b,a);
                            num.push(sum);
                        }
                        op.pop();
                    }
                    else {
                        if(op.empty()){
                            op.push(ch[i]);
                        }
                        else if(prior(ch[i])>prior(op.lastElement())){
                            op.push(ch[i]);
                        }
                        else {
                            int a = num.pop();
                            int b = num.pop();
                            char sy = op.pop();
                            sum = computer(sy,b,a);
                            num.push(sum);
                            op.push(ch[i]);
                        }
                    }
                }
            }
            while (!op.empty()){
                int a = num.pop();
                int b = num.pop();
                char sy = op.pop();
                sum = computer(sy,b,a);
                num.push(sum);
            }
            System.out.println(num.firstElement());
        }
    
        private int computer(char s,int a,int b){
            switch (s){
                case '+':
                    return a+b;
                case '-':
                    return a-b;
                case '*':
                    return a*b;
                case '/':
                    return a/b;
            }
            return 0;
        }
        private int prior(char ch){
            int x = 0;
            switch (ch){
                case '+' :
                case '-' :
                    x=1;
                    break;
                case '*' :
                case '/' :
                    x = 2;
                    break;
            }
            return x;
        }
    
        private int index(char []ch,int i,StringBuffer buffer){
            while (Character.isDigit(ch[i])){
                buffer.append(ch[i]);
                i++;
            }
            return i;
        }
    }
  • 相关阅读:
    Python实现二叉树的遍历
    Selenium模拟浏览器初识
    sklearn中的随机森林
    scrapy爬虫事件以及数据保存为txt,json,mysql
    mac安装mysql及终端操作mysql与pycharm的数据库可视化
    爬虫框架scrapy的基本内容
    多进程实例——爬取百度贴吧
    Python多进程并发操作进程池Pool
    【转】数据库设计三大范式
    【转】栈和堆的区别
  • 原文地址:https://www.cnblogs.com/zhanghaijie/p/8545684.html
Copyright © 2011-2022 走看看