一、后缀表达式求值:
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 ;
}