逆波兰表达式
前缀、中缀、后缀表达式的规则
前缀表达式
前缀表达式也叫波兰表达式,他的运算符位于操作数之前。规则如下:
1)从右到左扫描,将数字压入堆栈中,
2)遇到运算符将栈顶元素和栈顶次元素弹出计算,
3)将计算结果压入栈中,重复上述操作知道得出最后结果
前缀表达式的样子—— - * + 3 4 5 6 ==>(3+4)*5-6
中缀表达式
中缀表达式就是我们常见的那种表达式,这种表达式方便人去理解,但是计算机不容易理解。
中缀表达式的样子—— (3+4)*5-6
后缀表达式
后缀表达式也叫逆波兰表达式,他是计算机最容易理解的一种方式。
1)从左至右扫描表达式,遇到数字时,将数字压入堆栈,
2)遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素和栈顶元素),并将结果入栈;
3)重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
后缀表达式的样子—— 3 4 + 5 * 6 - ==> (3+4)*5-6
接下来是用逆波兰表达式实现计算器
计算器的实现
实现栈的操作
Stack s1 = new Stack();
思路如下
这里是要将list
辅助栈来实现的,先将字符串遍历加入到list
里面,通过循环遍历list
来实现计算
详细代码
public static void main(String[] args) {
// TODO 自动生成的方法存根
//先定义给逆波兰表达式
//(30+4)X5-6 => 304+5 X 6-=> 164
//4*5-8+60+8/2->45*8-60+82/+
//测试
//说明为了方便,逆波兰表达式的数字和符号使用空格隔开
//String suffixExpression= "304+5*6-";
String sufixExpression= "45* 8-60+82/+";// 76
//思路
//1.先将"34+5 X 6-"=>放到ArrayList中.
//2.将ArrayList 传递给一个方法,遍历ArrayList配合栈完成计算
List<String> list = getListString(sufixExpression);
System.out.println("rpnList=" + list);
int res = calculate(list);
System.out.println("计算的结果是=" + res);
}