数据结构学习记录——中缀表达式转后缀表达式

本文详细介绍了将中缀表达式转换为后缀表达式的步骤,包括初始化两个栈,按顺序扫描表达式,处理操作数、运算符和括号,并通过比较运算符优先级来决定何时压栈和弹栈。最后,输出s2栈中的元素顺序,得到后缀表达式。
摘要由CSDN通过智能技术生成

中缀转后缀具体步骤:
(1)初始化两个栈:运算符栈s1和存储中间结果的栈s2
(2)从左至右扫描中缀表达式
(3)遇到操作数时,将其压入s2
(4)遇到运算符时,比较其与s2栈顶运算符的优先级:
1)如果s1为空,或栈顶运算符为左括号“( ”,则直接将此运算符入栈
2)否则,若优先级比栈顶运算符的高,也将运算符压入s1
3)否则,将s1栈顶到的运算符弹出并压入到s2中,再次转到(4)-1)与s1中新的栈顶运算符相比较
(5)遇到括号时:
1)如果是左括号"(",则直接压入s1
2)如果是右括号")",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
(6)重复步骤(2-5),直到表达式的最右边
(7)将s1中剩余的运算符依次弹出并压入s2
(8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式

public class PolandNotation{
   
	public static void main(String[] args){
   
		//TODO Auto-generated mathod stub

		//完成一个中缀表达式转成后缀表达式的功能
		//说明
		//1、1 + ((2 + 3)× 4))- 5 转成 1 2 3 + 4 × + 5 -
		//2、因为直接对字符串操作不方便,因此先将这个字符串【1 + ((2 + 3)× 4))- 5】转成一个中缀表达式对应的list
		//即"1 + ((2 + 3)× 4))- 5" ==>  ArrayList[1,+,(,(,2,+,3,),*,4,),),-,5]

		//3、将得到的中缀表达式对应的List ==> 后缀表达式对应的List
		//即ArrayList[1,+,(,(,2,+,3,),*,4,),),-,5] ==> ArrayList[1,2,3,+,4,*,+,5,-]

		String expression = "1+((2+3)*4)-5";
		/**
		中缀转后缀的测试代码
		List<String> infixExpressionList = toInfixExpressionList(expression);
		System.out.println(infixExpressionList);//[1,+,(,(,2,+,3,),*,4,),),-,5] 
		List<String> parseSuffixExpressionList = parseSuffixExpressionList(infixExpressionList);
		System.out.println("后缀表达式对应的List"+suffixExpressionList);//[1,2,3,+,4,*,+,5,-]

		*/



		//先定义一个逆波兰表达式
		// (3 + 4)× 5 - 6 ==> 3 4 + 5 × 6 -
		//为了方便,逆波兰表达式的数字和符号使用空格隔开
		String suffixExpression = "3 4 + 5 × 6 -";
		//思路:
		//1、先将 "3 4 + 5 × 6 -"放到ArrayList中
		//2、将ArrayList传递给一个方法,遍历ArrayList,配合栈完成计算
		
		List<String> rpnList = getListString(suffixExpression);
		System.out.println("rpnList="+rpnList);

		int res = calculate(list);
		System.out.println("计算的结果是=" + res);
	}

	//即ArrayList[1,+,(,(,2,+,3,),*,4,),),-,5] ==> ArrayList[1,2,3,+,4,*,+,5,-]
	//方法:将得到的中缀表达式对应的List => 后缀表达式对应的List
	public static List<String> parseSuffixExpressionList(List<String> ls){
   
		//定义两个栈
		Stack<String> s1 = new Stack<String>();//符号栈
		//说明:因为s2这个栈,在整个转换过程中没有pop操作,而且后面我们还要逆序输出
		//因此比较麻烦,这里我们用List<String> s2替换Stack<String>
		List
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值