zoukankan      html  css  js  c++  java
  • 中缀表达式转后缀并计算(只考虑个位整数,不考虑除0等情况)

    中缀转后缀

    public class 中缀转后缀 {
        static char[] res;//存储结果
        static int len_r=0;
    
        static char[] stack;//操作符栈
        static int len_s=0;
    
        public static String transfer(String s){
            res=new char[s.length()];
            stack=new char[s.length()];
    
            char[] ch=s.toCharArray();
    
            for(int i=0;i<ch.length;++i){
                //数字直接输出到结果
                if(ch[i]>='0'&&ch[i]<='9'){
                    res[len_r++]=ch[i];
                }else{
                    //右括号:操作符出栈输出到结果,直到遇到左括号(左括号出栈但不输出到结果)
                    if(ch[i]==')'){
                        while(len_s>0&&stack[--len_s]!='('){
                            res[len_r++]=stack[len_s];
                        }
                    }else{
                        //左括号直接进操作符栈
                        if(ch[i]=='('){
                            stack[len_s++]=ch[i];
                        }else{
                            //操作符出栈输出到结果,直到遇到自己的位置。
                            int index=getIndex(ch[i]);
                            while(len_s>index){
                                res[len_r++]=stack[--len_s];
                            }
                            stack[len_s++]=ch[i];
                        }
                    }
                }
            }
            while(--len_s>=0){
                res[len_r++]=stack[len_s];
            }
            return new String(res,0,len_r);
        }
        /*
        * 如果是*或/,遇到(、+、-、空 进栈
        * 如果是+或-,遇到(、空 进栈
        * */
        static int getIndex(char ch){
            int index=0;
            boolean flag=true;
            if(ch=='+'||ch=='-'){
                flag=false;
            }
            for(int i=len_s-1;i>=0;--i){
                if(flag&&(stack[i]=='('||stack[i]=='+'||stack[i]=='-')){
                    index=i+1;
                    break;
                }
                if(!flag&&stack[i]=='('){
                    index=i+1;
                    break;
                }
            }
            return index;
        }
    }
    

      计算后缀表达式

    public class 计算后缀表达式 {
        public static int doCompute(String s){
            char[] ch=s.toCharArray();
            int[] stack=new int[s.length()];
            int len=0;
            for(int i=0;i<ch.length;++i){
                //数字进栈;遇到操作符ch,出栈两个数a,b(a先出),把b ch a的结果进栈。最后输出栈顶元素。
                if(ch[i]>='0'&&ch[i]<='9'){
                    stack[len++]=ch[i]-'0';
                }else{
                    int a=stack[--len];
                    int b=stack[--len];
                    stack[len++]=compute(a,b,ch[i]);
                }
            }
            return stack[0];
        }
        static int compute(int b,int a,char ch){
            int res=0;
            switch(ch){
                case '+':
                    res=a+b;
                    break;
                case '-':
                    res=a-b;
                    break;
                case '*':
                    res=a*b;
                    break;
                case '/':
                    res=a/b;
                    break;
            }
            return res;
        }
    }
    

      

  • 相关阅读:
    js获取当前日期
    Mysql错误1452
    数字输入框禁止输入字母
    laravel关联外键报错
    golang for range channel
    golang实现简单哈希表(拉链法解决冲突)
    K个一组反转链表(golang)
    golang 少见的语法问题(无用)
    golang实现循环队列
    数组中连续序列和最大值(循环数组)
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/9090970.html
Copyright © 2011-2022 走看看