Строка: Проверка на корректную расстановку скобок - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Дана строка, содержащая латинские буквы и скобки трех видов ( ), { }, [ ]. Если скобки расставлены правильно (то есть каждой открывающей соответствует закрывающая скобка того же вида), то вывести 0. В противном случае вывести или номер позиции, в которой расположена первая ошибочная скобка или, если закрывающих скобок не хватает, число -1. Неправильно работает, например, при вводе {] выводит -1, а должна номер ошибочной скобки.

Решение задачи: «Строка: Проверка на корректную расстановку скобок»

textual
Листинг программы
program task;
const
    open = [ '{', '[', '(' ];
    close = [ '}', ']', ')' ];
    n = 10;
type
    str = packed array[ 1..n ] of char;
    stack = ^chain;
    chain = record
        item: char;
        next: stack
    end;
var
    st: str;
    s: stack;
    ok: boolean;
    i: integer;
    c, c1: char;
    
procedure clearstack( var s: stack );
begin
    if s <> nil then begin
        clearstack( s^.next );
        dispose( s );
        s := nil;
    end;
end;
 
function isempty( s: stack ): boolean;
begin
    isempty := s = nil;
end;
 
procedure pop( var s: stack; var c: char );
var
    q: stack;
begin
    c := s^.item;
    q := s;
    s := s^.next;
    dispose( q );
end;
 
procedure push( var s: stack; c: char );
var
    q: stack;
begin
    q := s;
    new( s );
    s^.item := c;
    s^.next := q;
end;
 
procedure readstr( var st: str );
var
    i: integer;
begin
    for i := 1 to n do read( st[ i ] );
end;
 
begin
s := nil;
ok := true;
i := 1;
readstr( st );
while ok and ( i < n + 1 ) do begin
    c := st[ i ];
    if c in open then push( s, c ) 
    else
        if c in close then 
            if isempty( s ) then begin
                ok := false;
                writeln( i );
            end
            else begin
                pop( s, c1 );
                ok := ( c1 = '(' ) and ( c = ')' ) or
                    ( c1 = '{' ) and ( c = '}' ) or ( c1 = '[' ) and ( c = ']' );
                if not ok then writeln( i );
            end;    
    i := i + 1;         
end;
if ok then
    if not isempty( s ) then writeln( -1 )
    else writeln( 0 );
clearstack( s );
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы