Logic Bracket Checker-C ++ - PullRequest
       13

Logic Bracket Checker-C ++

0 голосов
/ 12 октября 2019
`#include <iostream>
#include<string>
#include <fstream>
using namespace std;
class node {
public:
    char data;
    node* next;
    node* prev;
};
class stack {
public:
    node* head = NULL;
    node* tail;
    void print();
    void push(char value);
    char pop();
};
void stack::push(char value)
{
    node* newNode = new node();
    newNode->data = value;
    if (head == NULL)
    {
        newNode->prev = NULL;
        newNode->next = newNode;
        head = newNode;
        tail = newNode;
        return;
    }
    newNode->next = NULL;
    newNode->prev = tail;
    tail->next = newNode;
    tail = newNode;
    return;
}
char stack::pop()
{
    char res = 'n';
    if (head == NULL)
    {
        cout << "Starting Bracket is Missing.(The Stac is Empty)" << endl;
        return 'n';
    }
    if (head == tail)
    {
        res = head->data;
        head = NULL;
        tail = NULL;
        return res;
    }
    res = tail->data;
    tail = tail->prev;
    tail->next = NULL;
    return res;
}
void stack::print()
{
    cout << endl;
    node* temp = head;
    while (temp->next != NULL)
    {
        cout << temp->data << " ";
        temp = temp->next;
    }
    cout << temp->data << " ";
    cout << endl << endl;
}
bool bc(string bracks)
{
    stack s;
    char chek;
    int n = 0;
    for (int z = 0; z < bracks.length(); z++)
    {
        if (bracks[z] == '(' || bracks[z] == '{' || bracks[z] == '[')
        {
            s.push(bracks[z]);
        }
        if (bracks.empty())
        {
            cout << "Given expression has no brackets.";
            return false;
        }
        if (bracks[z] == '}')
        {
            chek = s.pop();
            if (chek != '{')
            {
                cout << "Curly Bracket is misplaced" << endl;
                n++;
                s.push(chek);
            }
            continue;
        }
        if (bracks[z] == ')')
        {
            chek = s.pop();
            if (chek != '(')
            {
                cout << "Round Bracket is misplaced" << endl;
                n++;
                s.push(chek);
            }
            continue;
        }
        if (bracks[z] == ']')
        {
            chek = s.pop();
            if (chek != '[')
            {
                cout << "Square Bracket is misplaced" << endl;
                n++;
                s.push(chek);
            }
            continue;
        }
    }
    if (n != 0)
    {
        return false;
    }
    return true;
}
int main()
{
    int line = 0, err[17], x = 0;
    string temp;
    ifstream file;
    file.open("stack.cpp"); //a cpp file to be checked
    if (file.is_open())
    {
        while (getline(file, temp))
        {
            line++;
            if (!bc(temp))
            {
                err[x] = line;
                x++;
            }
        }
        file.close();
    }

    if (x == 0)
        cout << "Brackets are perfectly Placed" << endl;
    else
    {
        cout << "Brackets are not Even" << endl << "Error is found at lines:" << endl;
        for (int c = 0; c < x; c++)
            cout << err[c] << endl;
    }
    return 0;
}`

Явные скобки работают нормально, когда находятся в одной строке, но когда речь идет о самой программе на С ++, это плохо работает с фигурными скобками в нескольких строках. Все скобки работают хорошо, но скобки не в одной строке вызывают проблемы. Даже если в программу добавлено уравнение только фигурных скобок или что-то подобное, оно показывает неожиданные результаты.

1 Ответ

0 голосов
/ 13 октября 2019

Я не уверен, почему вы реализовали свой собственный класс стека, основанный на связанном списке. С новым. И нет удаления (поэтому создание утечек памяти) и других недостатков дизайна. Может быть, вы сделали для академических целей. Я не знаю. Если на самом деле есть причина для изобретения колеса и не использовать контейнер STL std::stack, тогда, пожалуйста, посмотрите на интерфейс STL std::stack и реализуйте те же функции в своем коде.

Не путайте функциональные возможности,В вашей поп-функции (которая относится к функциям стека) вы пишете о «скобках». Недостаток конструкции в том, что вы не реализовали функцию стека empty. Перед тем, как позвонить pop, вам следует проверить empty.

В любом случае, я бы порекомендовал использовать std::vector для всего этого.

В вашем коде много других проблем, но вы узнаете и узнаете.

Теперь к вашему вопросу. В основном вы отвечаете уже для себя.

То, что вы делаете, это

  • Прочитайте строку
  • Проверьте (с помощью bc), если в ЭТОМ и только ЭТО и НЕв других строках совпадают скобки
  • После оценки этой ОДНОЙ строки (с помощью bc) переменная stack s; выйдет из области видимости и исчезнет (оставляя много утечек памяти)
  • ТогдаВы читаете следующую строку файла (забывая обо всем, что вы делали раньше)

Решение:

Вы должны определить стек в main, а затем передать его в функцию bc какссылка.

И тогда вам нужно исправить остальные ошибки. ,.

...