算法描述
表达式由括号、运算符和操作数组成,从左向右逐个进行如下处理:
- 将操作数压入操作数栈
- 将运算符压入运算符栈
- 忽略左括号
- 遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈
最后在操作数栈中的值就是这个表达式的运算结果
代码实现
package ch1;
import java.util.Scanner;
/**
* Dijkstra的双栈算术表达式求值算法
* 将操作数压入操作数栈
* 将运算符压入运算符栈
* 忽略左括号
* 遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈
*/
public class Evaluate {
public static void main(String[] args) {
ResizingArrayStack<String> ops = new ResizingArrayStack<>(); // 运算符栈
ResizingArrayStack<Double> numbers = new ResizingArrayStack<>(); // 操作数栈
Scanner scanner = new Scanner(System