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

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

中缀表达式就是运算符号在运算数中间的表达式,比如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);
}
}

运行结果:
结对编程练习——四则运算

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