数据结构学习笔记--堆栈应用:中缀表达式求值(C)

看了浙大的数据结构视频,尝试写了这些代码
思考了一段时间得出的结果,这是得出的核心算法,表达存在一点问题可能,但是看看还是能看明白具体的逻辑,和大家分享学习交流

//目前只考虑了+-*/和()四则运算
OprandType EvaluateExpression(){          //转换为后缀表达式并计算
	CreateStack(CH);		//存储运算符
	Push(CH,'#');			//运算结束判别符号,栈顶出现#时,运算结束
	CreateStack(num);		//存储运算数或运算结果
	c = getchar();
	//if(getTop(CH)=='#') return;  自己的错误想法
  	while(c != '#' || getTop(CH)='#'){
		if(!In(c,CH,num)){	//判断输入是否为运算数
			Push(num,c);	//入栈(num存储运算数)
			c = getchar();	//接收下一字符
		}
		else{
			switch(Precede(getTop(CH),c)){
				case '<':		//如果由函数Precede()判断为'<',则压入运算符栈CH
				Push(CH,c);	getchar();
				break;			
				case '=':
				Pop(CH,x);	getchar();		//只有两个括号相遇才会被判别为'=',此时括号内的运算已经结束,取出右括号,运算继续
				break;
				case '>':
				Pop(CH,op);	Pop(num,b);	Pop(num,a); Push(num,Operate(a,op,b));	c = getchar();
				break;						//当判别为'>'时,从栈num取出两个运算数,从栈CH取出最上面的运算符
			}								//调用Operate()进行计算,然后将新计算出的运算数压入栈num
		}
	}
	return getTop(num);						//运算完成,取出num中的运算数即为我们最终的结果
}
Precede(char ch,c){	//判断栈顶元素和入栈元素的优先级
	ch = getTop(CH);	//获取栈CH最上面的运算符
	if(ch == '('){		
		if(c == ')')	//括相相遇,返回等号
		return '=';		
	else				//栈顶元素为'('时,除了')',其余运算符都可以入栈成为新的栈顶运算符
		return '<';		
	}
	else if(ch == '+' || ch == '-'){	
		if(c == '+' || c == '-')		//栈顶运算符和读入运算符同级时,栈顶运算符优先级大于读入运算符
			return '>';						
		else							//栈顶运算符优先级小于读入运算符,读入运算符入栈成为新的栈顶运算符
			return '<';					
	}
	else
		return '>';						//当栈顶运算符为'*'或'/'时,优先级最高
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值