Здравствуйте. Это мой код для преобразования выражения из инфикса в постфиксное, однако я просто не могу понять, как я могу оценить полученное выражение постфикса, и буду очень благодарен за любые советы. Я не прошу код, хотя это было бы полезно.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool operation(char b)
{
return b=='+' || b=='-' || b=='*' || b=='/' ;
}
bool priority(char a, char b)
{
if(a=='(')
{
return true;
}
if(a=='+' || a=='-')
{
return true;
}
if(b=='+' || b=='-')
{
return false;
}
return true;
}
int main()
{
string a;
string res;
stack<char> s;
cin>>a;
for(int i=0; i<a.size(); i++)
{
if(a[i]!='(' && a[i]!=')' && operation(a[i])==false)
{
res=res+a[i];
}
if(a[i]=='(')
{
s.push(a[i]) ;
}
if(a[i]==')')
{
while(s.top()!='(')
{
res+=s.top();
s.pop();
}
s.pop();
}
if(operation(a[i])==true)
{
if(s.empty() || (s.empty()==false && priority(s.top(), a[i])) )
{
s.push(a[i]);
}
else
{
while(s.empty()==false && priority(s.top(),a[i])==false )
{
res+=s.top();
s.pop();
}
s.push(a[i]) ;
}
}
}
while(s.empty()==false)
{
res+=s.top();
s.pop();
}
cout<<res;return 0;
}
Постскриптум У меня нет комментариев, но я полагаю, что сам код не требует пояснений))
P.P.S. Заранее спасибо.
Если вы сформируете свое выражение posfix, разделенное пробелом, следующее будет одним из самых простых способов кодирования оценщика, просто следуя алгоритм оценки
Это предполагает RPN как 5 1 2 + 4 * + 3 -
(разделенный пробелом)
int evaluate_posfix ( const std::string& expression )
{
int l,r,ans;
std::stringstream postfix(expression);
std::vector<int> temp;
std::string s;
while ( postfix >> s )
{
if( operation(s[0]) )
{
//Pull out top two elements
r = temp.back();
temp.pop_back();
l = temp.back();
temp.pop_back();
// Perform the maths
switch( s[0])
{
case '+': ans = l + r ; break;
case '-': ans = l - r ; break;
case '*': ans = l * r ; break;
case '/': ans = l / r ; break; // check if r !=0
}
temp.push_back( ans ); // push the result of above operation
}
else
{
temp.push_back( std::stoi(s) );
}
}
return temp[0] ; //last element is the answer
}
Других решений пока нет …