Что я пытаюсь сделать, определяется, находятся ли скобки в правильном порядке. Например, ([][[]]<<>>)
vallid, но ][]<<(>>)
нет.Проверьте правильность порядка скобок
У меня есть рабочая версия, но она имеет ужасную эффективность, и когда она получает 1000+ скобок, ее просто сумасшедшая медленная. Я надеялся, что кто-то может предложить некоторые возможные улучшения или другой способ сделать это.
Вот мой код:
program Codex;
const
C_FNAME = 'zavorky.in';
var TmpChar : char;
leftBrackets, rightBrackets : string;
bracketPos : integer;
i,i2,i3 : integer;
Arr, empty : array [0..10000] of String[2];
tfIn : Text;
result : boolean;
begin
leftBrackets := ' ([ /* ($ <! << ';
rightBrackets := ') ] */ $) !> >> ';
i := 0;
result := true;
Assign(tfIn, C_FNAME);
Reset(tfIn);
{ load data into array }
while not eof(tfIn) do
begin
while not eoln(tfIn) do
begin
read(tfIn, TmpChar);
if (TmpChar <> ' ') then begin
if (TmpChar <> '') then begin
Arr[i] := Arr[i] + TmpChar;
end
end
else
begin
i := i + 1;
end
end;
i2 := -1;
while (i2 < 10000) do begin
i2 := i2 + 1;
{if (i2 = 0) then
writeln('STARTED LOOP!');}
if (Arr[i2] <> '') then begin
bracketPos := Pos(' ' + Arr[i2] + ' ',rightBrackets);
if (bracketPos > 0) then begin
if (i2 > 0) then begin
if(bracketPos = Pos(' ' + Arr[i2-1] + ' ',leftBrackets)) then begin
{write(Arr[i2-1] + ' and ' + Arr[i2] + ' - MATCH ');}
Arr[i2-1] := '';
Arr[i2] := '';
{ reindex our array }
for i3 := i2 to 10000 - 2 do begin
Arr[i3 - 1] := Arr[i3+1];
end;
i2 := -1;
end;
end;
end;
end;
end;
{writeln('RESULT: ');}
For i2:=0 to 10 do begin
if (Arr[i2] <> '') then begin
{write(Arr[i2]);}
result := false;
end;
{else
write('M');}
end;
if (result = true) then begin
writeln('true');
end
else begin
writeln('false');
end;
result := true;
{ move to next row in file }
Arr := empty;
i := 0;
readln(tfIn);
end;
Close(tfIn);
readln;
end.
Входные данные в файле zavorky.in выглядеть, например, так:
<< $) >> << >> ($ $) [ ] <! () !>
() /* << /* [ ] */ >> <! !> */
я определить для каждой строки, является ли он действительным или нет. Максимальное количество скобок в строке равно 10000.
Но дело в том, что, поскольку одна строка скобок может быть длиной до 10.000 скобок, я не могу ее прочитать в строках, так как она не подходит , И деление 10.000 символов на строки не будет хорошо работать с проверками. – Mykybo
@Mykybo На самом деле это не проблема. Строка в Паскале похожа на массив символов. Объявите массив символов и заполните его из файла. Тогда используйте идею, которую я дал вам здесь. Если это необходимо, вы также можете повторно использовать функцию, например 'Pos'. Но, пожалуйста, не читайте файлы байтов байта. Это очень медленно. –
@ Mykybo Я приложил ответ. См. Идею, как сделать блок прочитанным вашего файла. –