ВУЗ:
Составители:
Рубрика:
152
Для решения задачи сформируем сначала пустой стек. Затем бу-
дем последовательно просматривать литеры строки, и открывающие
скобки поместим в стек. Если очередной символ окажется закрывающей
скобкой, выберем последнюю из занесенных в стек открывающих ско-
бок и сравним эти скобки на соответствие друг другу. Если соответст-
вие есть, то эффект должен быть такой же, как если бы этой пары ско-
бок в строке вообще не было. Если эти скобки не соответствуют друг
другу, то не выполнено второе условие соблюдения баланса скобок. Ес-
ли же в момент выбора из строки очередной закрывающей скобки стек
оказался пуст или по завершении просмотра стек оказался не пуст, то не
выполнено первое условие соблюдения баланса скобок.
Обозначим через s – стек, sym – обрабатываемый символ, а через
b – целую переменную, фиксирующую факт соответствия закрывающей
скобки из строки с открывающей скобкой из вершины стека. Для про-
верки на соответствие закрывающей скобки, являющейся значением пе-
ременной sym, и открывающей скобки в вершине стека, опишем специ-
альную функцию accord(), которая возвращает целое значение и удаля-
ет открывающую скобку из стека.
# include <fstream.h>
# include <stdlib.h>
# include “stack.cpp“
int accord (stack & s, char sym){
char r = s.pop ( );
switch (sym) {
case ‘)’ : return r = = ‘(‘;
case ‘]’ : return r = = ‘[‘;
case ‘}’ : return r = = ‘{‘;
default : break;
}
}
void main ( ) {
ifstream file ( “a.txt“ );
if ( !file ){ cout << “Ошибка при открытии файла a.txt!\n“; exit(1); }
stack s;
char sym; int i, n, b = 1;
while ( file.peek () != EOF && b){
file >> sym; cout <<sym;
switch (sym){
case ‘(’ : case ‘[’ : case ‘{’ : s.push(sym); break;
Страницы
- « первая
- ‹ предыдущая
- …
- 148
- 149
- 150
- 151
- 152
- …
- следующая ›
- последняя »