• 结对编程练习——四则运算


    一、中缀表达式与后缀表达式

    中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运算数后面的表达式,比如1 2 +。为什么要讲后缀表达式呢?因为电脑运算后缀表达式会比中缀表达式方便很多。那么如何运算后缀表达式呢?

    举个例子:计算9+(3-1)*3+6/2,转换为后缀表达式即为9 3 1 - 3 * + 6 2 / +(怎么转换后面再讲)。计算规则就是建立一个空栈,遇到数字就入栈,遇到符号就以符号前面的两个数为运算数进行计算。

    二、中缀表达式转换为后缀表达式

    法则:
    •如果遇到数字,我们就直接将其输出。
    •如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。
    •如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈。
    •如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈。
    •如果我们读到了输入的末尾,则将栈中所有元素依次弹出
    三:
    代码如下:

    import java.util.Stack;
    public class Operate {
    private Stack signStack = new Stack();
    private Stack numStack = new Stack();;
    public int caculate(String str) {
    String temp;
    StringBuffer tempNum = new StringBuffer();
    StringBuffer string = new StringBuffer().append(str);

        while (string.length() != 0) {
            temp = string.substring(0, 1);
            string.delete(0, 1);
                        if (!isNum(temp)) {
                .
                if (!"".equals(tempNum.toString())) {
                
                    int num = Integer.parseInt(tempNum.toString());
                    numStack.push(num);
                    tempNum.delete(0, tempNum.length());
                }
                while (!compare(temp.charAt(0)) && (!signStack.empty())) {
                        int a = (int) numStack.pop();
                        int b = (int) numStack.pop();
                        char op = signStack.pop();
                    int result = 0;
                    switch (op) {
                       
                        case '+':
                            result = b + a;
                          
                            numStack.push(result);
                            break;
                        case '-':
                            result = b - a;
                        
                            numStack.push(result);
                            break;
                        case '*':
                            result = b * a;
                            
                            numStack.push(result);
                            break;
                        case '/':
                            result = b / a;
                            numStack.push(result);
                            break;
                    }
    
                }
    
                if (temp.charAt(0) != '#') {
                    signStack.push(new Character(temp.charAt(0)));
                    if (temp.charAt(0) == ')') 
                        signStack.pop();
                        signStack.pop();
                    }
                }
            } else
                )
                tempNum = tempNum.append(temp);
        }
        return numStack.pop();
    }
    
    private boolean isNum(String temp) {
        return temp.matches("[0-9]");
    }
    private boolean compare(char str) {
        if (signStack.empty()) {
         
            return true;
        }
        char last = (char) signStack.lastElement();
        // 如果栈顶为'('显然,优先级最低,')'
        if (last == '(') {
            return true;
        }
        switch (str) {
            case '#':
                return false;
            case '(':
              
                return true;
            case ')':
               
                return false;
            case '*': {
           
                if (last == '+' || last == '-')
                    return true;
                else
                    return false;
            }
            case '/': {
                if (last == '+' || last == '-')
                    return true;
                else
                    return false;
            }
            
            case '+':
                return false;
            case '-':
                return false;
        }
        return true;
    }
    

    public static void main(String args[]) {
    Operate operate = new Operate();
    int t = operate.caculate("((5*7+6)-1)/2#");
    System.out.println(t);
    }
    }

    运行结果:

    四:
    结对感受:
    我觉得这个结对学习对我来说是个非常棒的选择,如果单让我一个人完成这个内容,就在编写代码这个坎上我就过不了,这次编写代码我不会的可以问他,一起讨论。

  • 相关阅读:
    TAOCP读书笔记——Search(1)
    JAVA进程间通信
    C++ Primer 阅读总结 (1)
    初来乍到
    [C#]手把手教你打造Socket的TCP通讯连接(二)
    [C#]手把手教你打造Socket的TCP通讯连接(三)
    数字ToString作为货币显示并且带小数
    [C#]手把手教你打造Socket的TCP通讯连接(一)
    [C#]手把手教你打造Socket的TCP通讯连接(四)
    WPF中使用ItemTemplate把所有Item都控制为指定大小
  • 原文地址:https://www.cnblogs.com/qm20165239/p/8849860.html
Copyright © 2020-2023  润新知