2013-04-24 80 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++)