Сбалансированные скобки, стек не перебирает другие строки в текстовом файле - PullRequest
0 голосов
/ 29 октября 2018

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

Вот код

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX_SIZE 1000

struct Stack{
    int top;
    char arr[MAX_SIZE];
} st;

void init(){
    st.top = -1;
}

bool isEmpty(){
    if(st.top == -1){
        return true;
    }else{
        return false;
    }
}

bool isFull(){
    if(st.top == MAX_SIZE-1){
        return true;
    }else{
        return false;
    }
}

void push(char item){
    if(isFull()){
            printf("Stack is full");
    }else{
        st.top++;
        st.arr[st.top] = item;
    }
}

void pop(){
    if(isEmpty()){
        printf("Stack is empty");
    }else{
        st.top--;
    }
}

char gettop(){
    return st.arr[st.top];
}

bool ArePair(char opening,char closing)
{
    if(opening == '(' && closing == ')') return true;
    else if(opening == '{' && closing == '}') return true;
    else if(opening == '[' && closing == ']') return true;
    return false;
}

void main()
{
    int length=0; //,i,j;
    init();
    int i;
    char output[MAX_SIZE];

    FILE * filepointer;
    filepointer = fopen("ajay1.txt", "r");


        if(filepointer == NULL)
            {
                printf("No File Found");
                return 1;
            }

       for(i=0; fgets(output, sizeof(output), filepointer) !=NULL; i++)
          {



     //fclose(filepointer);
    // init();

    //printf("Enter an expression to check:");
    //gets(output);

    length = strlen(output);

    for(i=0;i<length;i++){
        if(output[i] == '(' || output[i] == '{' || output[i] == '['){
                push(output[i]);
        }else if(output[i] == ')' || output[i] == '}' || output[i] == ']'){
            char a = gettop();
            printf("%c",a);
            if(isEmpty() || !ArePair(gettop(),output[i])){
                printf("\nResult - Invalid expression - Not a Balanced one !");
                return 0;
            }else{
                pop();
            }
        }
    }
    if(isEmpty()){
        printf("\nResult - Valid expression - Perfectly Balanced !");
    }else{
        printf("\nResult - Invalid expression - Not a Balanced one !");
    }
}
 fclose(filepointer);

}

1 Ответ

0 голосов
/ 29 октября 2018

следующий предложенный код:

  1. выполняет желаемую операцию
  2. чисто компилирует

и теперь предложенный код:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//#include <string.h>

#define MAX_SIZE 1000

struct Stack
{
    int top;
    char arr[MAX_SIZE];
};

struct Stack st;


void init()
{
    st.top = -1;
}


bool isEmpty()
{
    if(st.top == -1)
    {
        return true;
    }

    else
    {
        return false;
    }
}


bool isFull()
{
    if(st.top == MAX_SIZE-1)
    {
        return true;
    }

    else
    {
        return false;
    }
}


void push(char item)
{
    if( isFull() )
    {
        puts("Stack is full");
    }

    else
    {
        st.top++;
        st.arr[st.top] = item;
    }
}


void pop()
{
    if( isEmpty() )
    {
        puts( "Stack is empty" );
    }

    else
    {
        st.top--;
    }
}


char gettop()
{
    return st.arr[st.top];
}


bool ArePair(char opening,char closing)
{
    if( opening == '(' && closing == ')') 
        return true;

    else if( opening == '{' && closing == '}') 
        return true;

    else if( opening == '[' && closing == ']') 
        return true;

    return false;
}


int main( void )
{
    init();

    char output[MAX_SIZE];

    FILE * filepointer;
    filepointer = fopen("ajay1.txt", "r");


    if(filepointer == NULL)
    {
        perror("fopen failed");
        exit( EXIT_FAILURE );
    }

    while( fgets(output, sizeof(output), filepointer) )
    {
        puts( "\n\necho of line read: " );
        puts( output );

        for( size_t i=0; output[i]; i++ )
        {
            if( output[i] == '\n' )
            {
                puts( "finished with current line" );
                continue;
            }

            printf( "Current char under test: %c\n", output[i] );

            if(output[i] == '(' || output[i] == '{' || output[i] == '[')
            {
                push(output[i]);
                continue;
            }

            if(output[i] == ')' || output[i] == '}' || output[i] == ']')
            {
                if( isEmpty() ) 
                {
                    puts( "unbalanced pair" );
                    continue;
                }

                if( !ArePair( gettop(), output[i]) ) 
                {
                    puts( "pair not balanced" );
                    continue;
                }

                else
                {
                    puts( "pair matched" );
                }

                pop();

            }
        }
    }

    if(isEmpty())
    {
        puts("\nResult - Valid expression - Perfectly Balanced !");
    }

    else
    {
        puts("\nResult - Invalid expression - Not a Balanced one !");
    }

    fclose(filepointer);

}

Учитывая содержимое опубликованного файла, вот вывод:

echo of line read: 
()

Current char under test: (
Current char under test: )
pair matched
finished with current line


echo of line read: 
[]

Current char under test: [
Current char under test: ]
pair matched
finished with current line


echo of line read: 
[

Current char under test: [
finished with current line


echo of line read: 
]

Current char under test: ]
pair matched
finished with current line


echo of line read: 
{}

Current char under test: {
Current char under test: }
pair matched
finished with current line


echo of line read: 
{

Current char under test: {
finished with current line

Result - Invalid expression - Not a Balanced one !
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...