一、中缀表达式与后缀表达式
中缀表达式就是运算符号在运算数中间的表达式,比如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
private 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);
}
}
运行结果:
四:
结对感受:
我觉得这个结对学习对我来说是个非常棒的选择,如果单让我一个人完成这个内容,就在编写代码这个坎上我就过不了,这次编写代码我不会的可以问他,一起讨论。