• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Указатель в Паскале

  • Автор темы Paha
  • Дата начала
P

Paha

Используя очередь и стек из входного файла f проанализировать текст сбалансированный по скобкам:
<текс> ::= <пусто>|<элемент><текст>
<элемент>::=<буква>|(<текст>).
Напечатать упорядоченные пары номеров открывающих скобок.
Объясните, как это вообще делать?? :)
 
P

Paha

Используя очередь и стек из входного файла f проанализировать текст сбалансированный по скобкам:
<текс> ::= <пусто>|<элемент><текст>
<элемент>::=<буква>|(<текст>).
Напечатать упорядоченные пары номеров открывающих скобок.
Объясните, как это вообще делать?? :(
Вот решение с тестами:
Код:
program dz6;

{Ob'yavlenie konstant}

Const
osh1 = 'Fail pust';
osh2 = 'Lishnie zakrivayushiesya skobki';
osh3 = 'Lishnie otkrivayushiesya skobki';
osh4 = 'Nekorrektniy vvod dannih';
osh5 = 'Skobok net';
osh6 = 'Skobka zakrita prezhdevremenno';

{Ob'yavlenie stacka}

Type
EXST = ^ST;
ST = record
Data: integer;
Next: EXST;
End;

{Ob'yavlenie peremennih}

Var
Stack: EXST;
f:text;
k,j, i:integer;
str : string;
h : boolean;

{zanesenie elementa v stack}

Procedure WriteStack(Var u : EXST; tekst : integer);
Var
x : EXST;
Begin
new(x);
x^.Data := tekst;
x^.Next := u;
u := x;
End;

{udalenie verhnego elementa}

Procedure DelStack(Var x1:Exst);
Var
u : Exst;
Begin
u := x1;
x1 := x1^.Next;
dispose(u);
End;

{Obrabotka oshibok}

Function Test ( l, m : integer) : boolean;
Begin
Test := false;
If l < m then
Writeln (osh2)
Else
If l > m then
Writeln (osh3)
Else
If (l = m) and (l<>0) and (m<>0) then
Test := true
Else
Writeln(osh5);
End;

{Obrabotka oshibok}

Procedure Prov (a : string);
Var
Stack : EXST;
Begin
Stack := Nil;
i := 1;
j := 0;
k := 0;
While (i<=Length(a)) do
Begin
If (a[i]='(') then
Inc(j);
If (a[i]=')') then
Inc(k);
Inc(i);
End;
End;


BEGIN
stack := nil;
i:=1;
h := true;
Assign (f, 'text.txt');
Reset(f);
If EOF(f) then
Write (osh1)
Else
Begin
readln (f,str);
While i<= length(str) do
Begin
If not( (( str[i]='(') or (str[i] =')') or (str[i] = ' ')) or	((str[i]> 'a') and (str[i] < 'z'))) then
h:=false;
Inc(i);
End;
If not h then
Writeln(osh4)
Else
Begin
Prov(str);
If test(j, k) then
i:=1;
While i<= length(str) do
Begin
If (str[i] = '(') then
writeStack(Stack,i);
If (str[i] = ')') then
Begin
If stack <>Nil then
Begin
Writeln('Otkrivayushayasya skobka ',Stack^.Data,' Zakrivayushayaya skobka ', i);
DelStack(stack);
End
Else
Writeln(osh6);
End;
Inc(i);
End;
End;
End;
Close (f);
readln;

END.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!