2013-04-24 84 views
1

这是反向波兰语Notation的代码。当我在unix上运行它时,它工作正常,但codechef说错了答案。请帮忙。Codechef:反向波兰语Notation

#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; 
    } 
} 
+2

我不确定这是否是问题,但不应该在j的每次迭代期间将i变量重置为零? – 2013-04-24 15:27:03

+0

1.你能想到*任何* RPN输入将*不*与此工作? 2.从#1中考虑**所有**的可能性。 3.你有没有通过这个多个* RPN样本? 3.在发布有关CodeChef或其他此类编程任务网站的问题时,*链接特定网站问题。* – WhozCraig 2013-04-24 15:28:13

+0

'char expr [400];'我认为400是输入的最大长度。你需要0终结者的空间。 – 2013-04-24 15:35:11

回答

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 
0

你必须初始化无符号长I = 0的地方;在for循环中,就好像你采用两个或更多的测试用例一样,我将从每个下一个用例的最后一个案例中的剩余位置开始。

1

改变这一行

for(;i<len;i++) 

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

,然后它会正常工作。在codechef中有很多测试用例,所以在你的程序中,它对于第一个测试用例可以正常工作,但之后会失败,因为第二个测试用例中'i'的值将从第一个用例的结尾开始。所以,你必须在每个测试用例中初始化我的值。

0

添加

top=0; 
stack[0]=0; 

在功能main结束for前和更改
for(;i<len;i++)for(i=0;i<len;i++)