Помощь - Поиск - Пользователи - Календарь
Полная версия: Как сосчитать количество закрывающихся скобок?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Новичок
Есть строка, в которой есть скобки - открывающиеся и закрывающиеся. Если скобок не равное количество, то надо вывести "количество скобок не равно", (это просто), а если равное, то проверить нет ли где-нибудь такой ситуации, что открывающаяся скобка стоит после закрывающейся (это трудно) =)
SHnur
Это легко можно реализовать при помоши стека (можно даже не динамического стека , реализованого на массиве ).

Алгоритм такой :

Код
for i := 1 to {длина строки ...} do begin
  {если нашли открывающуюся скобку то добовлякм в стек}
  {иначе смотрим на вершину стека , если там откр.скобка , то удаляем её}
       {иначе , выходим из цикла , (уже есть случай неправильной постоновки скобок)}
end;
{если пройден весь цикл , то проверяем стек , если он НЕ пустой , то (уже есть случай неправильной постоновки скобок)}


Вот возможный вариант решения :

Код
program skobki;
var stek : array[1..255] of char;
   head : byte;

function isempty:boolean;
begin
  isempty := (head = 0)
end;
procedure POP;
begin
  if not(isempty) then dec(head);
end;
procedure PUSH(c:char);
begin
  inc(head);
  stek[head] := c;
end;
function showHead:char;
begin
  showHead := stek[head];
end;

var wrong :boolean;
   i : byte;
   input : string;
begin
  head := 0;
  for i := 1 to 255 do stek[i] := ' ';
  wrong := false;

  writeln('input :');
  readln(input);

  for i := 1 to ord(input[0]) do begin
     if input[i] = '(' then PUSH(input[i])
     else if input[i] = ')' then
        if showHead = '(' then POP
        else begin wrong := true; break; end;
  end;
  if not(wrong) then wrong := not(isempty);
  writeln(wrong);
  readln;
end.
volvo
Новичок
Поиском здесь кто-нибудь будет пользоваться? Есть же решения ...
http://forum.pascal.net.ru/index.php?showt...%EA%EE%E1%EA%E8
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.