运行时错误SIGSEGV中缀为postfix

时间:2014-09-18 12:33:00

标签: c++ runtime iostream 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 个答案:

答案 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/

希望它澄清一点,如果不是完全的话。谢谢!