• 结对学习四则运算


    四则运算结队学习

    代码:
    -import java.util.*;
    public class fourrule{

    public char[] op = {'+','-','*','/','(',')'};  
    public String[] strOp = {"+","-","*","/","(",")"};  
    public boolean isDigit(char c){  
        if(c>='0'&&c<='9'){  
            return true;  
        }  
        return false;  
    }  
    public boolean isOp(char c){  
        for(int i=0;i<op.length;i++){  
            if(op[i]==c){  
                return true;  
            }  
        }  
        return false;  
    }  
    public boolean isOp(String s){  
        for(int i=0;i<strOp.length;i++){  
            if(strOp[i].equals(s)){  
                return true;  
            }  
        }  
        return false;  
    }  
    /** 
     * 处理输入的计算式 
     * @param str 
     * @return 
     */  
    public List<String> work(String str){  
        List<String> list = new ArrayList<String>();  
        char c;  
        StringBuilder sb = new StringBuilder();  
        for(int i=0;i<str.length();i++){  
            c = str.charAt(i);  
            if(isDigit(c)){  
                sb.append(c);  
                  
            }  
            if(isOp(c)){  
                if(sb.toString().length()>0){  
                    list.add(sb.toString());  
                    sb.delete(0, sb.toString().length());  
                }  
                list.add(c+"");  
            }  
        }  
        if(sb.toString().length()>0){  
            list.add(sb.toString());  
            sb.delete(0, sb.toString().length());  
        }  
        return list;  
    }  
    public void printList(List<String> list){  
        for(String o:list){  
            System.out.print(o+" ");  
        }  
    }  
    /** 
     * 中缀表达式转化为后缀表达式 
     * 1,遇到数字输出 
     * 2,遇到高优先级的全部出栈 
     * 3,最后全部出栈 
     */  
    public List<String> InfixToPostfix(List<String> list){  
        List<String> Postfixlist = new ArrayList<String>();//存放后缀表达式  
        Stack<String> stack = new Stack<String>();//暂存操作符  
        //stack.push('#');  
        for(int i=0;i<list.size();i++){  
              
            String s = list.get(i);  
            if(s.equals("(")){  
                stack.push(s);  
            }else if(s.equals("*")||s.equals("/")){  
                stack.push(s);  
            }else if(s.equals("+")||s.equals("-")){  
                if(!stack.empty()){  
                    while(!(stack.peek().equals("("))){  
                        Postfixlist.add(stack.pop());  
                        if(stack.empty()){  
                            break;  
                        }  
                    }  
                    stack.push(s);  
                }else{  
                    stack.push(s);  
                }  
            }else if(s.equals(")")){  
                while(!(stack.peek().equals("("))){  
                    Postfixlist.add(stack.pop());  
                }  
                stack.pop();  
            }else{  
                Postfixlist.add(s);  
            }  
            if(i==list.size()-1){  
                while(!stack.empty()){  
                    Postfixlist.add(stack.pop());  
                }  
            }  
        }  
        return Postfixlist;  
    }  
    /** 
     * 后缀表达式计算 
     */  
    public int doCal(List<String> list){  
        Stack<Integer> stack = new Stack<Integer>();  
        for(int i=0;i<list.size();i++){  
            String s = list.get(i);  
            int t=0;  
            if(!isOp(s)){  
                t = Integer.parseInt(s);  
                stack.push(t);  
            }else{  
                if(s.equals("+")){  
                    int a1 = stack.pop();  
                    int a2 = stack.pop();  
                    int v = a2+a1;  
                    stack.push(v);  
                }else if(s.equals("-")){  
                    int a1 = stack.pop();  
                    int a2 = stack.pop();  
                    int v = a2-a1;  
                    stack.push(v);  
                }else if(s.equals("*")){  
                    int a1 = stack.pop();  
                    int a2 = stack.pop();  
                    int v = a2*a1;  
                    stack.push(v);  
                }else if(s.equals("/")){  
                    int a1 = stack.pop();  
                    int a2 = stack.pop();  
                    int v = a2/a1;  
                    stack.push(v);  
                }  
            }  
        }  
        return stack.pop();  
    }  
    

    }
    import java.util.*;

    public class Test {

    public static void main(String[] args) {  
        fourrule lt = new fourrule();  
        String str = "9+(3-1)*3+10/2";  
        List<String> list = lt.work(str);  
        List<String> list2 = lt.InfixToPostfix(list);  
        System.out.println("原式为:"+str);  
        System.out.print("后缀表达式为:");  
        lt.printList(list2);  
        System.out.println(" ");  
        System.out.println("计算结果为:"+lt.doCal(list2));  
    }  
    

    }

    缺陷:

    代码中无法用Scanner输入,面对不同的计算式需要在Test.java内部修改运算式,由于时间问题,我与我的结对学习伙伴目前只做到了这一步。

    运行结果:

    结对学习照片:

    码云链接:

    https://gitee.com/BESTI-IS-JAVA-2018/20165213zqh/tree/master/src

  • 相关阅读:
    二开案例.开发环境.从零开发第一个插件和数据字典
    二开案例.开发环境.调试插件代码
    C#中@的用法总结
    金蝶云社区年度资料合辑
    MySQL知识框架[博文汇总-持续更新]
    Redis基础篇(五)AOF与RDB比较和选择策略
    Redis基础篇(四)持久化:内存快照(RDB)
    单调栈技巧总结
    Redis基础篇(三)持久化:AOF日志
    Redis基础篇(二)高性能IO模型
  • 原文地址:https://www.cnblogs.com/xiaozhuzqh/p/8849976.html
Copyright © 2020-2023  润新知