Ошибка во время выполнения инфикс SIGSEGV в постфикс
Этот код отлично работает на моей машине, но когда я загружаю его в codechef, он дает мне ошибку во время выполнения SIGSEGV. Кто-нибудь может указать ошибку в моем коде? Это вопрос, который я сделал для http://www.codechef.com/problems/ONP/
#include<iostream>
#include<string>
using namespace std;
class stack
{
public:
void push(char a)
{
++top;
arr[top]=a;
}
void pop()
{
top--;
}
void initialize(int size)
{
top=-1;
max=size;
}
bool chckfull()
{
return (top==max-1);
}
bool chckempty()
{
return (top==-1);
}
char front()
{
return arr[top];
}
private:
int top;
int max;
char arr[404];
};
int chckalphanum(char y)
{
if((y>='a')&&(y<='z'))
return 1;
else if ((y>='A')&&(y<'Z'))
return 1;
else if((y>='0')&&(y<='9'))
return 1;
return 0;
}
int pre(char x)
{
if(chckalphanum(x))
return 0;
if(x=='(')
return -1;
else if(x=='^')
return 3;
else if((x=='/')||(x=='*'))
return 2;
else
return 1;
}
int main ()
{
std::ios::sync_with_stdio(false);
string s, s1=")";
char q[404];
int qmax=0,t;
stack prs;
scanf("%d", &t);
while(t--)
{
cin>>s;
prs.initialize(s.length());
prs.push('(');
s=s+s1;
for(int i=0; i<s.length(); i++)
{
if(s[i]=='(')
prs.push('(');
else if(chckalphanum(s[i]))
{
q[qmax]=s[i];
qmax++;
}
else if(s[i]==')')
{
while(prs.front()!='(')
{
q[qmax]=prs.front();
qmax++;
prs.pop();
}
prs.pop();
}
else
{
while(pre(prs.front())>=pre(s[i]))
{
q[qmax]=prs.front();
qmax++;
prs.pop();
}
prs.push(s[i]);
}
}
for(int i=0; i<qmax; i++)
cout<<q[i];
cout<<"\n";
qmax=0;
}
return 0;
}
1 ответ
Я только что прокомментировал нижеприведенную строку из вашего решения, и оно было принято в codechef.
std::ios::sync_with_stdio(false);
Я не уверен, что вы знаете, что делает вышеприведенная строка, но я постараюсь объяснить, насколько мне известно. Лучшие ответы, безусловно, последуют со временем от сообщества.
"С отключенной синхронизацией stdio объекты стандартных потоков iostream могут работать независимо от стандартных потоков C (хотя они и не обязаны), а операции микширования могут привести к неожиданно чередующимся символам".
Цитирование из cppreference.
"Параллельный доступ к одному и тому же объекту потока может вызвать скачки данных".
Поскольку вы отключили синхронизацию между stdio (ввод / вывод в стиле C) и iostream (ввод / вывод в стиле C++) и продолжили использовать scanf
а также cin
Я подозреваю, что вы получили ошибку во время выполнения.
Для получения дополнительной информации, пожалуйста, посетите: http://www.cplusplus.com/reference/ios/ios_base/sync_with_stdio/
Надеюсь, это прояснит немного, если не полностью. Спасибо!