2016-09-29 3 views
0

Почему это не печать «Паратезис сбалансирован». . Он падает всякий раз, когда я прохожу баланс скобки, как «(2 + 4)» и т.д. И отлично работает, когда я прохожу разбалансировки скобку, как «((3 + 4 (» Вот мой кодСкорлупа не сбалансирована

struct stackADT { 
    int count; 
    char data[50]; 
} s; 


bool Is_Equal(char b, char c){ 
    if(b == '(' && c == ')') 
      return true; 

    if(b == '{' && c == '}') 
      return true; 


    if(b == '[' && c == ']') 
      return true; 

    else{ 
      return false; 

    } 
} 


bool pop(struct stackADT *s, int *num) { 
    if (Is_Empty()) 
     return false; 
    else { 
     *num = s->data[(s->count) -1]; 
     (s->count)--; 
     return true; 
    } 
} 

int main(void) { 
    char expression[100]; 
    int i, len; 
    initialize(); 
    printf("Enter an expression: "); 
    scanf("%s", &expression); 
    len = strlen(expression); 


    for(i = 0; i < len; i++){ 
     if(expression[i] == '(' || expression[i] == '{' || expression[i] == '['){ 
      push(expression[i]); 
     } 
      if(expression[i] == ')' || expression[i] == '}' || expression[i] == ']'){ 

       pop(&s,expression[i]); 
     } 
    } 

    if(Is_Equal(pop(&s, expression[i]), expression[i])) 
     printf("Parenthesis are balanced\n"); 
    else{ 
     printf("Parenthesis are unbalanced\n"); 
    } 
    return 0; 
    getch(); 
} 
+1

Вы прочитали комментарии к своему предыдущему вопросу? –

+0

Да, эта часть выполнена, но у меня возникают проблемы с выяснением того, почему она не печатает «Скобки сбалансированы». – Sami

+1

* Отладить его *. Начните с простого случая '()'. –

ответ

1

в.:

if(Is_Equal(pop(&s, expression[i]), expression[i])) 

i больше len (размер expression). И ваш компилятор должен жаловались, потому что вы pushung полукокса, где, как ожидается, указатель на междунар.

Итак, первый поворот предупреждения о .

+0

Я включил предупреждения, но я не понимаю, что вы говорите, уточните, пожалуйста. – Sami

+0

Paul означает, включите предупреждения, * затем измените свой код, чтобы он не выдавал никаких предупреждений *, а затем попробуйте запустить его. Предупреждение от компилятора означает: «это не является строго незаконным, но почти наверняка не то, что вы имеете в виду» – pm100

1

Функция Is_Equal имеет тип прото:

bool Is_Equal(char b, char c) 
       ^^^^^^ 
       Expects a char 

Функция pop имеет тип прото:

bool pop(struct stackADT *s, int *num) 
^^^^ 
Returns a bool 

Так эта линия имеет общую проблему:

if(Is_Equal(pop(&s, expression[i]), expression[i])) 
       ^^^^^^^^^^^^^^^^^^^^^^ 
       bool but char was expected! 

То же можно сказать о функции pop. Он ожидает int* в качестве второго аргумента, но вы передаете char. Например, здесь:

pop(&s,expression[i]); 
Смежные вопросы