Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2012, 22:42   #11
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Алгоритм описан в книге:
А. Шень, Программирование. Теоремы и задачи. 2004
Насколько верно/не верно он описан и насколько эффективно использовать этот алгоритм не спорю. Просто приведу свою реализацию:
Program MyProg_01;
{Эта часть из Т.А. Павловская. Программирование на ЯВУ. Паскаль}
Код:
Type TNode = ^Node; {описание узла стека}
     Node = Record
        i: Integer;
        p: TNode;
     End;

Function Push(Top: TNode; I: Integer): TNode; {Вложить в стек}
var p: TNode;
begin
   new(p);
   p^.i := I;
   p^.p := Top;
   push:= p;
end;

Function Pop(Top: TNode; var I: Integer): TNode; {Извлечь из стека}
var p: TNode;
begin
   I:= Top^.i;
   Pop:= Top^.p;
   Dispose(Top);
end;

{Тут моя вариация}
Function Bracket2Nomber(ch: Char): Integer; {Нумерация скобок и иных символов}
begin
   case ch of
     '{': Bracket2Nomber := 3;
     '}': Bracket2Nomber := -3;
     '[': Bracket2Nomber := 2;
     ']': Bracket2Nomber := -2;
     '(': Bracket2Nomber := 1;
     ')': Bracket2Nomber := -1;
     else Bracket2Nomber := 0; {иные символы}
   end;
end;

var fh: Text;
    str: String;
    Top: TNode;
   Ok, Err: Boolean;
    i, k, m, n, z: Integer;

BEGIN
 {Файл со строками. Программа рассматривает каждую строку отдельно}
   assign(fh,'c:\MyTst\Test.txt');
   reset(fh);
   k := 0; {номер прочитанной строки}
   While Not Eof(fh) do begin {Пока не конец файлв}
     readln(fh, str); {Читаем строку}
    k := k + 1;
     Top := Nil;       {Указатель на вершину стека обнуляем}
     i := 0;             {Счетчик символов в строке}
     Err := False;    {Ошибка в конфигурации скобок}
     n := Length(str);  {Длинна строки}
     while ((i < n) and (NOT Err)) do begin {не конц строки и нет ошибки в конфигурации скобок}
        i := i + 1; {обработаем следующий символ}
        m := Bracket2Nomber(str[i]); {нумеруем символ}
        If m <> 0 Then {скобка}
           If (m > 0) Then {открывающаяся скобка - в стек}
             Top := Push(Top,m)
           Else begin {закрывающаяся скобка}
             If Top = Nil Then {стек пуст}
                Err := True      {это ошибка}
             Else begin {стек не пуст}
                Top := Pop(Top,z); {читаем из стека}
                Err := (z <> -m);   {проверяем на соответствие.}
{ Тут я предлагал сложить и проверить на ноль}
{If ((z+m) =0) Then Err := false  Else Err := true;}
             end; {else}
           end; {else}
     end; {while - просмотрели все символы строки}
     Ok := (NOT Err) AND (Top = Nil); {Ошибка и состояние стека}
   While Top <> Nil do {На тот случай, когда стек не пуст}
   Top := Pop(Top, z);
     writeln('Line: ', k:4, ' ', Ok);   {Номер просмотренной строки и результат на экран}
   end; {while - просмотрели все строки файла}
END.
Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 06.07.2012, 11:09   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну да. согласен. это вполне рабочий вариант.
вы, когда описывали алгоритм, забыли упомнуть об одной ВАЖНОЙ детали.
о том, что при закрывающей скобке элемент на вершине стека и текущий должны быть СТРОГО одинаковы по модулю, но с разными знаками:
Цитата:
Код:
                Err := (z <> -m);   {проверяем на соответствие.}
согласитесь, а эта строчка весьма важна в данном алгоритме!


p.s. а мой вариант не проще (см. пост #9)?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2012, 11:33   #13
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Serge_Bliznykov
Код:
вы, когда описывали алгоритм, забыли упомнуть об одной ВАЖНОЙ детали.
о том, что при закрывающей скобке элемент на вершине стека и текущий должны быть СТРОГО одинаковы по модулю, но с разными знаками:
Там было так:
Код:
Складываешь извлеченное число с имеющимся. Если ноль, то все Ок иначе ошибка.
Это другая версия той же проверки. В моём варианте кода - в комментарии.

Цитата:
Насколько верно/не верно он описан и насколько эффективно использовать этот алгоритм не спорю.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 06.07.2012, 11:50   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ViktorR
Там было так:
Цитата:
Складываешь извлеченное число с имеющимся. Если ноль, то все Ок иначе ошибка.
угу. теперь, после того, как я увидел программу, беру свои слова насчёт неверного алгоритма назад.
Могу сказать, я был уверен, что в вашем алгоритме числа СУММИРУЮТСЯ.
те. если встретились две открывающиеся фигурные скобки {{ - то в стеке получается число 6 (3+3).
Теперь я вижу, что я неправильно понял алгоритм. Числа, соответствующие открывающимся скобкам, хранятся в стеке в виде ОТДЕЛЬНЫХ значений.


p.s. зато теперь в теме есть ДВА различных варианта решения.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа проверки правильности расстановки скобок glushara Помощь студентам 2 23.04.2012 02:49
Проверка правильности расстановки круглых скобок. torren108 Помощь студентам 7 11.12.2011 20:15
С++ Перегрузка квадратных скобок Namolem Помощь студентам 1 29.04.2010 02:45
Проверить равенство числа открывающих и закрывающих круглых скобок 010 Паскаль, Turbo Pascal, PascalABC.NET 6 18.05.2008 00:27
проверить правильность расстановки операторов begin и end Тёмка Помощь студентам 1 10.12.2007 13:07