Оценка переполнения стека

Здравствуйте. Это мой код для преобразования выражения из инфикса в постфиксное, однако я просто не могу понять, как я могу оценить полученное выражение постфикса, и буду очень благодарен за любые советы. Я не прошу код, хотя это было бы полезно.

#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. Заранее спасибо.

0

Решение

Если вы сформируете свое выражение 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
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]