Язык С++ и программирование на нем. Рейзлин В.И. - 150 стр.

UptoLike

Составители: 

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;