数据结构与算法学习笔记4--------中缀表达式转后缀表达式

一.什么是中缀表达式

前缀(波兰式)、中缀、后缀(逆波兰式)表达式三者都是运算表达式,只是形式有区别,即运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;后缀表达式运算符位于与其相关的操作数之后。
中缀表达式是人常用的运算表达式,对于人脑来说容易理解,但是对计算机来说计算中缀表达式较为困难,故需要把中缀表达式转为后缀表达式再进行运算。

public static List<String> parseSuffixExpressionList(List<String> ls){
		//定义两个栈
		Stack<String> s1 = new Stack<String>();//符号栈
		//Stack s2 = new Stack(); s2这个栈在转换过程中没有pop操作 故直接用ArrayList
		
		List<String> s2 = new ArrayList<String>();
		
		for(String item:ls) {
			//如果是一个数 加入s2
			if(item.matches("\\d+")) {
				s2.add(item);			
			}else if(item.equals("(")) {
				s1.push(item);
			}else if(item.equals(")")){
				//右括号则执行“消除括号操作” 将s1栈顶符号弹出压入s2 直到遇到左括号为止 ----》丢弃括号
				while(!s1.peek().equals("(")) {
					s2.add(s1.pop());//s1弹出 加入 s2
				}
				s1.pop();//这样就消掉了括号
			}else{
				//当item优先级小于等于s1栈顶运算符的优先级
				while(s1.size()>0 && operation.getVal(item)<= operation.getVal(s1.peek())  ) {
					s2.add(s1.pop());
				}
				//循环结束后,将item再压入栈顶
				s1.push(item);
			}
		}
		//将s1剩余的运算符加入s2中
		while(s1.size()!=0) {
			s2.add(s1.pop());
		}
		return s2;
	}

你可能感兴趣的:(数据结构与算法java学习笔记)