Ниже приведен мой код для преобразования infix
в postfix
нотацию, а затем postfix
. Этот код работает нормально и дает правильный ответ, но в конце я получаю эту ошибку во время выполнения.
Почему эта ошибка возникает? Я использую Viusal C++ 2010.
Код:
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
int getPrecedence( char tmp )
{
if(tmp=='+')
{
return 1;
}
else if(tmp == '-')
{
return 1;
}
else if(tmp == '*')
{
return 2;
}
else if(tmp == '/')
{
return 2;
}
else if(tmp == '=')
{
return 0;
}
else if(tmp == '(')
{
return -1;
}
else if(tmp == ')')
{
return -1;
}
}
int main()
{
stack<char> st;
char expression[10];
cout<<"Enter expression : ";
//cin>>expression;
strcpy(expression,"x=(0+1)+(y=2+3)");
char postfix[100]; // its postfix string
int counter=0;
int i=0;
int bracketCheck = 0;
//(a+b)
while( expression[i] != '\0' ) // iterate till '/0' does not come.
{
if(expression[i]== '+' || expression[i]== '-' || expression[i]== '*' || expression[i]== '/' || expression[i]== '=' )
{
if( st.empty() )
{
st.push(expression[i]);
}
else // when stack not empty
{
int topPrecedence = getPrecedence( st.top() );
int expressionPrecedence = getPrecedence( expression[i] );
while( !(topPrecedence < expressionPrecedence) )
{
postfix[counter++] = st.top();
st.pop() ;
if(! st.empty() )
{
topPrecedence = getPrecedence( st.top() );
}
else
{
break;
}
}
//if( st.empty() )
//{
// st.push( expression[i] );
//}
if( topPrecedence < expressionPrecedence )
{
st.push( expression[i] );
}
}
}
else if( expression[i]=='(' )
{
st.push( expression[i] );
bracketCheck++;
}
else if( expression[i]==')' )
{
int topPrecedence = getPrecedence( st.top() );
int expressionPrecedence = getPrecedence( expression[i] );
while( topPrecedence >= expressionPrecedence) // +>=) --- 1 >= -1 ------- +>=) --- -1 >= -1
{
if( getPrecedence( st.top() ) != -1 )
{
postfix[counter++] = st.top();
}
char BracketFound = st.top();
st.pop();
if( !st.empty() )
topPrecedence = getPrecedence( st.top() );
if( st.empty() ) // break out of loop when stack is empty
break;
if( BracketFound == '(' )
break;
}
}
else // when its an alphabet
{
postfix[counter++] = expression[i];
}
i++;
} // outer while ends
while( ! st.empty() )
{
postfix[counter++] = st.top();
st.pop();
}
postfix[counter] = '\0';
i=0;
while( postfix[i] != '\0' )
{
cout<<postfix[i]<<" ";
i++;
}
stack<char> e; // eval stands for evaluation
i=0;
while( postfix[i] != '\0' )
{
if( postfix[i] == '+' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left + right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '-' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left - right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '*' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left * right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '/' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left / right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '=' )
{
int right = e.top();
//left = left - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
//right = right - 48;
e.pop();
//int result = right + left;
//result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( right );
}
else
e.push( postfix[i] );
i++;
}
// while ends
cout<<endl;
cout<<"result= "<<e.top()<<endl;
system("pause");
return 0;
}
Ну, первая проблема, которую я вижу, заключается в том, что вы копируете 15 символов + нулевой ограничитель в выражение [10]. В принципе, вы набиваете 16 фунтов в 10-фунтовый мешок.
char expression[10];
//<snip>
strcpy(expression,"x=(0+1)+(y=2+3)");
Посмотрите на то, что вы копируете в expression
(не забывайте о конце \0
). Вы выделили 10 пробелов в своем массиве, но вы пытаетесь сохранить 16 в нем, и вы переполняете свой буфер.
getPrecedence
.#include <string> //... std::string expression; expression="x=(0+1)+(y=2+3)";