Наталья Гусева
Наталья Гусева

определения правильности скобочного выражения на основе стека, реализованного с помощью массива с++

Добрый вечер, уважаемые коллеги!
Пользователь вводит выражение, содержащее скобки. Нужно проверить правильность заполнения этих скобок, т. е. если есть 3 закрывающих скобки, и 3 открывающих, то выражение правильное. ((())). Если же их количество не совпадает, то выражение неправильное. Надо реализовать функцию на основе стека. Т. е. если в выражении содержится скобка, то она помещается в вершину стека. Если при этом прошлое выражение содержит открывающую скобку ( "(" ), а следующее закрывающую ( ")" ), то вершина стека обнуляется. Я реализовал вот в такой программе:
for(int i=0;i<10000;i++)
{
if ((massiv_input=='(') or
(massiv_input==')'))

{
top_of_stack = massiv_input;

if ((top_of_stack == ')') and (massiv_stack[j] == '('))
{
massiv_stack[j] = NULL;
top_of_stack = massiv_stack[j-1];
j--;
}
else
{
massiv_stack[j] = top_of_stack;
j++;
}
}
}

for (int i=0;i;
}

Вопрос состоит в следующем: у меня почему то массив просто переписывает входной массив. Почему скобки не уничтожаются взаимно и как сделать так, чтобы печатались лишь лишние скобки в ответе (т. е. если больше закрывающих, то закрывающие, если больше открывающих то открывающие)
С Уважением!

потому что нужно реализовать именно с помощью статического массива

ТК
Татьяна Кузнецова

Вообще-то стек с помощью массива лучше реализовывать, но, правда, если известно максимально возможное заполнение стека.
В Вашей задаче стек совсем-то и не нужен. Достаточно одной переменной, которая хранит значение, учитывающее появление тех или иных скобок. Например, открывающая скобка +1, а закрывающая -1. Если все скобки парные, то в идеале должен получиться 0.
Кстати, а что скажет Ваша программа, если пользователь вначале вводит закрывающую скобку, а потом открывающую? Ведь в итоге ноль! Кстати со счётчиком - это случай появления отрицательных значений в нём, что очень легко перехватить, если такой вариант является ошибкой.
Ну а если всё-таки хочется реализовать с помощью массива, то прежде всего надо позаботиться о его размере при его объявлении. Но не в коем случае не переписывать данные, а иметь смещаемый по массиву указатель на вершину стека

Марина Буланкина
Марина Буланкина

А зачем ты стек реализовываешь через массив?

АВ
Александр Вяткин

Стек обычно реализутся через указатели, тоесть создается структура с двумя полями, первый хранид данные а вторая указатель на саму себя (структуру) .

struct Stack
{
int data;
Stack *next;
};

При обавлении данных, создается новый структура, указатель которой присваивается предыдущей структуре в поле next;

Тоесть в next будет храниться указатель на следующий элемент. А если это последний элемент то *next = NULL;

Похожие вопросы
Как получить из двух массивов следующие выражения:
Дан стек из 5 символов, вытащить из стека символы.
Не правильно удаляются элементы массива
Инвертировать каждую строку текстового файла с помощью стека. С++.
C# помощь по массиву.
реализация программного дека. Помогите реализовать программный дек с помощью массива из 8 структур. На си.
Массивы. Нужна помощь
PHP. Закрасить ячейки массива в определенном диапазоне.
Как реализовать список на основе динамического массива на паскале? (Turbo Pascal)
Как решать через стек на С++ ?