这段代码在我的机器上工作正常但是当我将它上传到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;
}
答案 0 :(得分:3)
我刚从你的解决方案中注释掉了以下这一行,并且在codechef中被接受了。
std::ios::sync_with_stdio(false);
我不确定您是否知道上述内容的作用,但我会尽力向您解释。社区将在适当时候提供更好的答案。
“关闭stdio同步后,iostream标准流对象可以独立于标准C流运行(尽管它们不是必需的),混合操作可能会导致意外交错的字符。”
引用cppreference。
“对同一个流对象的并发访问可能会导致数据竞争。”
由于您已关闭stdio(C样式I / O)和iostream(C ++样式I / O)之间的同步
并且您继续同时使用 scanf
和 cin
交错,我怀疑您遇到了运行时错误。
如需更多研究,请查看:http://www.cplusplus.com/reference/ios/ios_base/sync_with_stdio/
希望它澄清一点,如果不是完全的话。谢谢!