Codechef:反向波兰表示法

时间:2013-04-24 15:13:46

标签: c postfix-notation

这是反向抛光表示法的代码。当我在unix上运行它时工作正常但是codechef说错了答案。请帮忙。

#include<stdio.h>
#include<string.h>

void push(char);
void pop();

char stack[400];
unsigned long top=0;

int main()
{
    unsigned long len, test_case,i=0,j=0;
    char expr[400];

    scanf("%u\n",&test_case);

    for(;j<test_case;j++)
    {
        scanf("%s\n",expr);
        len=strlen(expr);

        for(;i<len;i++)
        {
            if(expr[i]=='+'||expr[i]=='-'||expr[i]=='*'||expr[i]=='/'||expr[i]=='^')
                push(expr[i]);

            else if(expr[i]==')')
            {
                pop();
            }

            else if(expr[i]=='(')
                continue;

            else
                printf("%c",expr[i]);
        }
    }

    return 0;
}

void pop()
{
    if(top==-1)
        return;
    else
    {
        printf("%c",stack[top]);
        top=top-1; 
    }
}

void push(char x)
{
    if(top==400)
        return;
    else
    {
        stack[++top]=x;
    }
}

4 个答案:

答案 0 :(得分:2)

更改此行

 for(;i<len;i++)

for(i=0;i<len;i++)

然后它会正常工作。在codechef中有很多测试用例,因此在你的程序中,它可以在第一个测试用例中正常工作,但之后它会失败,因为&#39; i&#39;从第二个测试用例开始,它将从第一个案例结束。因此,您必须在每个测试用例中初始化i的值。

答案 1 :(得分:0)

暂时只留下我注意到的地方

`scanf("%u\n",&test_case);` //"%u" for unsigned not unsigned long

`scanf("%s\n",expr);` //%s : newline to not input are separated by white space

答案 2 :(得分:0)

你必须初始化无符号长i = 0;在for循环中,好像你接受了两个或更多的测试用例,我会从最后一个案例中为每个下一个案例开始。

答案 3 :(得分:0)

添加

top=0;
stack[0]=0;

在结束for循环之前的函数main并更改
for(;i<len;i++)for(i=0;i<len;i++)