Zubair Farahi Ответов: 2

Кто-нибудь может помочь мне заставить этот код работать


я пытаюсь сбалансировать эти символы , я получаю некоторые ошибки , может ли кто-нибудь попытаться увидеть мой код там, где мне нужны изменения

Ошибка " ошибка сегментации: 11"

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char T;
#include "stack.h"

int isBalanced(char s[100])
{
    Stack *stack;
    int n=strlen(s);
    int i;
    for(i=0;i<n;i++)
    {
      if(s[i]=='(' || s[i]=='[' || s[i]=='{')
      {
        Push(&stack,s[i]);
      }
      else if(s[i]==')' || s[i]==']' || s[i]=='}')
      {
        if(IsEmptyStack(stack))
        {
          return 0;
        }
        else if(Top(stack)!=s[i])
          Pop(stack);     
      }
    }
    if(IsEmptyStack(stack))
      return 1;
    else
      return 0;
   

}

int main()
{
    char s1[100]="((()))", s2[100]="((())(";

    if(isBalanced(s1))
      printf("Balanced | \n");
    else
      printf("Not balanced | \n");

    if(isBalanced(s2))
      printf("Balanced | \n");
    else
      printf("Not balanced | \n");

    return 0;
}

Dave Kreskowiak

... и ошибки были бы...?? подсказка: действительно важная часть, которую вы оставляете вне вопроса.

Patrice T

"я получаю некоторые ошибки"
Какие сообщения об ошибках ?
Этот код не завершен, мы не можем его запустить.

Zubair Farahi

ОПС! dam sorry a " ошибка сегментации: 11"

Zubair Farahi

#include < stdio.h>
#include <stdlib.h>
#include & lt;string.h>
typedef char T;
#включить "stack. h"

int isBalanced(char s[100])
{
Стек *стек;
int n=strlen(s);
int i;
для (i=0;i< n; i++)
{
если(Х[я]=='(' || с[я]=='[' || с[я]=='{')
{
Push(& stack, s[i]);
}
остальное, Если(х[я]==')' || с[я]==']' || с[я]=='}')
{
if (IsEmptyStack(stack))
{
возвращает 0;
}
else if (Top (stack)!=s[i])
Pop(стек);
}
}
if (IsEmptyStack(stack))
возврат 1;
еще
возвращает 0;


}

тап_п()
{
char s1[100]="((()))", s2[100]="((())(";

если(isBalanced(s1))
printf ("сбалансированный | \n");
еще
printf ("не сбалансировано | \n");

если (isBalanced(s2))
printf ("сбалансированный | \n");
еще
printf ("не сбалансировано | \n");

возвращает 0;
}

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

2 Ответов

Рейтинг:
1

CPallini

Вы имеете в виду

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

int isBalanced(char s[100])
{
    stack<char> stk;
    int n=strlen(s);
    int i;
    for(i=0;i<n;i++)
    {
      if(s[i]=='(' || s[i]=='[' || s[i]=='{')
      {
        stk.push(s[i]);
      }
      else if(s[i]==')' || s[i]==']' || s[i]=='}')
      {
        if(stk.empty())
        {
          return 0;
        }
        else if(stk.top() != s[i])//<--- What's the purpose of this line?
          stk.pop();
      }
    }
    if(stk.empty())
      return 1;
    else
      return 0;
}


Однако я не могу догадаться о назначении отмеченной линии


Zubair Farahi

для проверки того, не находится ли вершина стека в паре с массивом s[i]

Рейтинг:
1

Patrice T

Ваш алгоритм ошибочен.
Когда вы сталкиваетесь с открытием ([{, вы толкаете его на стек, так далеко, так хорошо.
Когда вы сталкиваетесь с закрытием )]}, вы проверяете, пуст ли стек, хорошо.
затем вы должны проверить, совпадает ли закрывающая скобка с открывающей в стеке, в противном случае это ошибка.
если ( находится на вершине стека, ) это единственный разрешенный вариант.

Вы должны переосмыслить свой алгоритм.
Когда я сталкивался с открывающей скобкой, я нажимал закрывающий аналог на стек, это упрощало последующую проверку.