中缀表达式:a+b*c+(d*c+f)*g
相应的后缀表达式:abc*+de*f+g*+
转化思想:
1. 输出 a b 栈 + (栈空,+入栈)
2.输出 abc 栈 +* (*的优先级比+高,*入栈)
3.输出 abc*+ 栈 + (+的优先级低于栈顶的*,*出栈,+的优先级不高于栈顶的+,栈顶+出栈,+入栈)
4.输出abc*+d 栈+( ('('具有最高优先级,因此入栈)
5.输出abc*+de 栈+(* (由于除非正在处理闭括号,否则开括号不会从栈中弹出)
6.输出abc*+de*f 栈+(+ (+的优先级低于栈顶的*,*出栈,+入栈)
7.输出abc*+de*f+ 栈+ (读入‘)’,弹出栈元素直到‘(’)
8.输出abc*+de*f+g 栈+*
9.输出abc*+de*f+g*+ 栈 (由于输入为空,栈中元素全部弹出)
后缀表达式的计算,例子6 5 2 3 + 8 * + 3 + *
栈的变化如下:
6 5 2 3
6 5 5 (5=2+3)
6 5 5 8
6 5 40 (40=5*8)
6 45 (45=40+5)
6 45 3
6 48 (48=45+3)
288 (288=6*48)
#include <iostream>
#include<stack>
#include<string>
#include<vector>
#include<cstdlib>
using namespace std;
//判断运算符的优先级
int pro ( char c )
{
int p = 0;
switch ( c )
{
case '+':
case '-':
p = 1;
break;
case'*':
case'/':
p = 2;
break;
case'(':
case')':
p = 0;
break;
}
return p;
}
//运算符号入栈\出栈
void enterstack ( stack<char> & cs , char c, vector<string> & s1 )
{
char p;
string s;
if ( cs.empty() || c == '(' )
cs.push ( c );
else if ( c == ')' )
{
while ( cs.top() != '(' )
{
s = cs.top();
s1.push_back ( s );
cs.pop();
}
cs.pop();
}
else if ( c == '=' )
{
while ( !cs.empty() )
{
s = cs.top();
s1.push_back ( s );
cs.pop();
}
}
else
{
p = cs.top();
if ( pro ( c ) > pro ( p ) )
cs.push ( c );
else
{
s = p; //char转化为string
s1.push_back ( s );
cs.pop();
enterstack ( cs, c, s1 );
}
}
}
//中缀表达式转化成后缀表达式
void pretosuf ( string &s, vector<string> & s1 )
{
stack<char> cs;//栈,运算符号
string str; //将char转化成string
for ( int i = 0, j = 0; i < s.size(); i++ )
{
int flag = 0;
while ( s[i] <= '9' && s[i] >= '0' || s[i] == '.' )
{
str = s[i];
if ( flag == 0 )
{
s1.push_back ( str );
j = s1.size();
flag = 1;
}
else
{
s1[j - 1] += s[i];
}
i++;
}
enterstack ( cs, s[i], s1 ); //运算符号输出 or 入栈
str = s[i];
if ( s[i] == '=' )
{
s1.push_back ( str );
break;
}
}
}
//计算后缀表达式结果
double calculator ( vector<string> &s )
{
stack<double> data;
double d, a, b;
for ( int i = 0; s[i] != "="; i++ )
{
if ( s[i] == "+" )
{
a = data.top();
data.pop();
b = data.top();
data.pop();
data.push ( a + b );
}
else if ( s[i] == "-" )
{
a = data.top();
data.pop();
b = data.top();
data.pop();
data.push ( b - a );
}
else if ( s[i] == "*" )
{
a = data.top();
data.pop();
b = data.top();
data.pop();
data.push ( a * b );
}
else if ( s[i] == "/" )
{
a = data.top();
data.pop();
b = data.top();
data.pop();
data.push ( b / a );
}
else
{
d = atof ( s[i].c_str() );
data.push ( d );
}
}
return data.top();
}
int main()
{
vector<string> str;
string s;
double sum;
getline ( cin, s );
pretosuf ( s, str );//中缀表达式转化为后缀表达式
sum = calculator ( str );//计算后缀表达式
cout << sum << endl;
return 0;
}
运行结果