X16数据结构部分04
中缀表达式转后缀表达式实现思路
/*
中缀表达式
转后缀表达式
思路分析
比较麻烦
需要耐心分析
案例
1 + ( ( 2 + 3 ) * 4 ) - 5
预期结果:16
*/
/*
详细步骤
1. 创建两个栈,一个存放运算符,一个存放中间结果,中间结果就是计算过后的数字栈
2. 从左至右扫描中缀表达式
3. 遇到数字时,压入栈s2
4. 遇到运算符时,比较与栈顶运算符的优先级
a. 栈顶为空或栈顶为左括号,直接将该运算符入栈1
b. 优先级高于栈顶元素,也将运算符压入s1栈中
c. 否则,如果栈顶是小括号类的非运算符,压入栈s1
如果优先级一样,直接弹出s1栈顶元素,并压入s2中,并重新回到a的判断
我认为这里是算法实现的关键
5. 遇到括号时
a. 左括号直接入栈
b. 右括号的话,依次弹出s1的运算符,直到遇到左括号为止
再把左括号弹出,做完这些步骤后继续循环
6. 扫描结束后,将s1剩余运算符依次弹出并压入s2
7. 依次弹出s2元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
还有一个人工中缀转后缀
后缀:把运算符号移动到对应的括号后面,然后再去掉小括号
*/
中缀转后缀辅助方法
/**
* 字符串表达式转ArrayList集合
* @param string 字符串表达式
* @return ArrayList集合
*/
public static List<String> stringExpressionToArrayList(String string){
// 1+((2+3)*4)-5
/*
初始化数据
*/
List<String> stringList = new ArrayList<>(); // 定义结果集
String str; // 多位数拼接
int index = 0; // 遍历字符串
char c; // 遍历到的字符
do {
if ((c = string.charAt(index)) < 48 || (c = string.charAt(index)) > 57){
/*
程序运行到此处
说明c不是一个数字
直接加入stringList集合就行
*/
stringList.add("" + c);
index++;
}else{
/*
程序运行到此处
说明c是一个数字
这个时候需要考虑多位数
并且需要判断后一位是否
已经走到了表达式最后
*/
str = "";
while (index < string.length() && (c = string.charAt(index)) >= 48 && (c = string.charAt(index)) <= 57){
/*
程序运行到此处
说明是多位数
需要进行拼接
*/
str += c;
index