2013-04-24 2 views
1

Это код для обратной полярности. Когда я запускаю его в 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; 
    } 
} 
+2

Я не уверен, что это проблема, но не должна ли переменная i быть сброшена до нуля во время каждой итерации j? – 2013-04-24 15:27:03

+0

1. Можете ли вы придумать * любой * вход RPN, который бы * не * работал с этим? 2. Учет ** всех ** возможностей из # 1. 3. Прошли ли вы через * несколько образцов RPN с этим? 3. При размещении вопросов о CodeChef или других подобных веб-сайтах для программирования, * ссылку на конкретный вопрос сайта. * – WhozCraig

+0

'char expr [400];' Я думаю, 400 - это максимальная длина ввода. Вам нужно место для 0-терминатора. –

ответ

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

вы должны инициализировать неподписанные долго я = 0; внутри цикла, как если бы вы приняли два или более тестовых примера, я начну с того места, где он остался в последнем случае для каждого следующего случая.

1

Изменение этой линии

for(;i<len;i++) 

в

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

, а затем он будет работать нормально. В кодеке есть много тестовых таблиц, поэтому в вашей программе он отлично работает для 1-го тестового теста, но после этого он будет терпеть неудачу, потому что значение «i» из 2-го теста будет начинаться с того места, где оно заканчивается в первом случае. Итак, вы должны инициализировать значение i в каждом тестовом файле.

0

Добавить

top=0; 
stack[0]=0; 

до окончания цикла for в функции main и изменить
for(;i<len;i++) в for(i=0;i<len;i++).

Смежные вопросы