Автор: Новичок 17.03.2005 18:05
Есть строка, в которой есть скобки - открывающиеся и закрывающиеся. Если скобок не равное количество, то надо вывести "количество скобок не равно", (это просто), а если равное, то проверить нет ли где-нибудь такой ситуации, что открывающаяся скобка стоит после закрывающейся (это трудно) =)
Автор: SHnur 17.03.2005 18:40
Это легко можно реализовать при помоши стека (можно даже не динамического стека , реализованого на массиве ).
Алгоритм такой :
Код
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 17.03.2005 20:30
Новичок
Поиском здесь кто-нибудь будет пользоваться? Есть же решения ...
http://forum.pascal.net.ru/index.php?showtopic=2868&hl=%F1%EA%EE%E1%EA%E8