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

Тема в разделе "Pascal and Delphi", создана пользователем Paha, 31 янв 2011.

  1. Paha

    Paha Гость

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

    Paha Гость

    Вот решение с тестами:
    Код (Text):
    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.
     
Загрузка...
Похожие Темы - Указатель Паскале
  1. Vunderkind
    Ответов:
    3
    Просмотров:
    1.808
  2. Vadik(R)
    Ответов:
    0
    Просмотров:
    2.109
  3. vital
    Ответов:
    4
    Просмотров:
    3.197
  4. acorn
    Ответов:
    8
    Просмотров:
    14.789
  5. авщалом
    Ответов:
    0
    Просмотров:
    856

Поделиться этой страницей