后缀表达式计算和中缀表达式转后缀表达式(栈的应用)

一、后缀表达式求值:

1.遍历后缀表达式;
    1)、若是进行运算的数值,压入栈内
    2)、若是运算符,取出栈顶的两个操作数,先取出的为右操作数,后取出的为左操作数,然后进行运算,运算结果压栈。
2.最后遍历完成,栈内剩下的最后一个元素即为结果。

//代码如下:
double func(string s) {
	stack<double> sta;  //开始构建用来放操作数的堆栈
	for (int i = 0; i < s.size(); i++) {
		if (s[i] >= 'a' && s[i] <= 'z') {   
			double tmp = double (s[i] - 'a' + 1);
			sta.push(tmp);
		}
		else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
			double s1=0, s2=0;

			s1 = sta.top();
			sta.pop();
			s2 = sta.top();
			sta.pop();

			double res = 0;
			switch (s[i]) {
				case'+': res = s2 + s1; break;
				case'-': res = s2 - s1; break;
				case'*': res = s2 * s1; break;
				case'/': res = s2 / s1; break;
				default: break;
			}
			sta.push(res);
		}
	}
	return sta.top();
} 

 

2.中缀表达式转后缀表达式

【过程】
1)、遇到操作数,添加进后缀表达式。
2)、栈为空时,遇到运算符时,直接进栈。
3)、遇到‘(’,直接进栈
4)、遇到‘)’,执行出栈操作,并将出栈元素添加进后缀表达式中,直到栈顶为‘(’,左括号不添进后缀表达式。
5)、遇到其他运算符:弹出所有优先级大于或者等于该运算符的栈顶元素,遇栈空或‘(”停止。最后该运算符进栈。
6)、最后将栈内元素弹出添入后缀表达式。

//代码如下
void transfer(string s) {
	stack<char> sta;  //创建用来存放运算符的栈
	for (int i = 0; i <s.size(); i++) {
		if (s[i] == '+' || s[i] == '-') {
					if (sta.empty()) {     //栈为空时即直接进栈
						sta.push(s[i]);
					}
					else
					{
						while (!sta.empty()) {
							cout << sta.top();
							sta.pop();
						}
						sta.push(s[i]);
					}
		}
		else if (s[i] == '*' || s[i] == '/' || s[i] == '%') {
					if (sta.empty())
						sta.push(s[i]);
					else {
						while (!sta.empty() && (sta.top() == '*' || sta.top() == '/' || sta.top() == '%')) {      //取栈顶元素时需时刻注意栈是否为空
							cout << sta.top();
							sta.pop();
						}
						sta.push(s[i]);
					}
		}
		else {
			cout <<  s[i];
		}
	}
	while (!sta.empty()) {              //最后弹出栈内所有运算符
		cout <<  sta.top();
		sta.pop();
	}
	return ;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值