【数据结构】详解栈的应用之表达式求值

本文详细介绍了中缀、前缀和后缀表达式及其求值方法。通过中缀转后缀、手动加括号的方式解释了中缀表达式到后缀表达式的转换,并提供了求值算法。同时,对比了前缀表达式求值的过程,强调了前缀和后缀表达式在计算时的便利性,无需括号即可明确运算顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先明白:

前缀表达式:符号在前,如-×+3456

中缀表达式:符号在中间,如(3 + 4) × 5 - 6

后缀表达式:符号在最后,如34+5×6-,后缀表达式不出现括号。

中缀表达式转后缀表达式的方法: 


1.遇到数字:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,将栈的元素全部输出,直到弹出栈的是左括
号为止,且左括号不输出直接删除
5.遇到其他运算符:加减乘除:若当前运算符小于等于栈中运算符优先级,依次出栈,然后再将该运算符入栈
6.最终将栈中的符号依次出栈,输出。


运算符优先级(常用的记忆一下,和常识吻合)
1 [] () (同级)
3 */
4 +-

 代码

//定义一个运算符栈op
struct{
	char data[MAXSIZE]; //存放运算符
	int top;  //栈顶指针 
}op; 
void trans(char exp[],char postexp[]){
	char ch;
	int i,j;    //i是中缀exp的下标,j是后缀postexp的下标
	op.top=-1;
	ch=exp[i];  //获取输入的第一个字符 
	i++;
	while(ch!='\0'){
		switch(ch){
			case '(':    //遇到左括号直接入栈 
				op.top++;
				op.data[op.top]=ch;
				break;
			case ')':    //遇到右括号,栈顶元素不断出栈直到遇到左括号 
				while(op.data[op.top]!='('){
					postexp[j]=op.data[op.top];
					j++;
					op.top--;
				}
				op.top--;  //遇到了左括号,直接删除 
				break; 
			case '+':   //因为加减运算符优先级最低,不大于任何其他运算符,所以直接入栈 
			case '-':
				while(op.top!=-1&&op.data[op.top]!='('){ //栈不为空且没有遇到左括号,都直接出栈 
					postexp[j]=op.data[op.top];
					j++;
					op.top--;
				}
				op.top++;         //即:栈为空或遇到了左括号,当前运算符进栈 
				op.data[op.top]=ch;
				break;
			case '*':
			case '/':
				while(op.top!=-1&&op.data[op.top]!='('&&(op.data[op.top]=='*'||op.data[op.top]=='/
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值