Счетчик операций со стеком - Pascal

Узнай цену своей работы

Формулировка задачи:

есть код работы сортировки стека и надо сделать счетчик операций со стеком. В принципе смог реализовать счетчик, но есть подозрение что-то не так,потому что при сортировки 100 элементов выходит 469064 операций. Можете подсказать что я упустил или наоборот накосячил.

Решение задачи: «Счетчик операций со стеком»

textual
Листинг программы
program Project4;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
type ochered=^Rec;
     Rec=record
     info:    integer;
     next:    ochered;
     end;
var
head, head1:  ochered;
n, i, j, z, k,  y, x, x1: integer;
t,t1,t2: TDateTime;
ch: int64;
 
procedure push(var head:ochered; x:integer);  // 6
var a:        ochered;
begin
    new(a);                                //+1
    a^.info:=x;                            //+2
    a^.next:=head;                         //+2
    head:=a;                               //+1
    ch:=ch+6;
end;
 
procedure pop(var head:ochered; var x:integer);  //8+
var a, p:     ochered;
begin
   a:=head;  p:=head; ch:=ch+3;          //+2
       while a^.next<>nil do begin       //+2
         p:=a; a:=a^.next; ch:=ch+4;     //+3
       end;
   x:=a^.info; p^.next:=nil;             //+4
   dispose(a);                           //+1
   ch:=ch+5;
end;
 
function empty(head:ochered): boolean;    //2
begin
   empty:=head=nil;                      //+2
   ch:=ch+2;
end;
 
procedure iniz(var head:ochered; var n:integer);  //1+
var x, i:      integer;
begin
   for i:= 1 to n do begin
      x:=Random(501)+300;             //+3
      push(head,x);                   //+6
      ch:=ch+9;
   end;
end;
 
BEGIN
ch:=0; //счетчик
write('Enter the number of items: ');
   readln(n);
   t1:=now;
   head := nil;
iniz(head,n);
head1:=nil;
ch:=ch+6;
 
For i:= 1 to n-1 do
  For j:= n downto i+1 do begin
    if not empty(head1) then begin  //+3
      head:=head1;                    //+1
      head1:=nil;                     //+1
      ch:=ch+2;
    end;
    ch:=ch+1;
    For z:=1 to j-2 do begin   //1+
       pop(head,y); push(head1,y);//+6+8+
    end;
    ch:=ch+2;
    pop(head,x); pop(head,x1); // 16+2*
    If x>x1 then begin       //+1
      push(head1,x); push(head1,x1);
    end //+12
    else begin
      push(head1,x1); push(head1,x);
    end; //+12
    ch:=ch+1;
    If j<n then begin                    //+1
        For k:= 1 to n-j do begin      //1+
          pop(head,y); push(head1,y);       //+6+8
        end;
        ch:=ch+1;
    end;
    ch:=ch+1;
end;
 
For i:= 1 to n do begin
  pop(head1,x);
  writeln('stack[',i,'] = ',x);
  ch:=ch+1;
end;
ch:=ch+1;
t2:=now; t:=t2-t1;
writeln;
writeln('Your time: ',FormatDateTime('hh:mm:ss.zzz',t));
writeln('Num of operations: ',ch);
readln;
 
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
 
end.

Объяснение кода листинга программы

  1. Объявление переменных и типов данных:
    • head, head1: ochered;
    • n, i, j, z, k, y, x, x1: integer;
    • t,t1,t2: TDateTime;
    • ch: int64;
    • ochered = ^Rec;
    • Rec = record info: integer; next: ochered; end;
  2. Функция push(var head:ochered; x:integer):
    • Создание нового элемента в стеке (new(a));
    • Присваивание значения и добавление в стек (a^.info:=x; a^.next:=head; head:=a;);
    • Увеличение счетчика операций на 6.
  3. Функция pop(var head:ochered; var x:integer):
    • Проверка пустоты стека (a^.next<>nil) и удаление всех элементов до последнего (while a^.next<>nil do begin a:=a^.next; disopse(a); end);
    • Сохранение значения последнего элемента (x:=a^.info;);
    • Удаление ссылки на последний элемент (p^.next:=nil;);
    • Увеличение счетчика операций на 8.
  4. Функция empty(head:ochered): boolean:
    • Проверка равенства head и nil (empty:=head=nil);
    • Увеличение счетчика операций на 2.
  5. Процедура iniz(var head:ochered; var n:integer):
    • Создание n случайных чисел и добавление их в стек (for i:= 1 to n do begin x:=Random(501)+300; push(head,x); end);
    • Увеличение счетчика операций на 9.
  6. Основной цикл программы:
    • Проверка пустоты стека и удаление элементов до указанного индекса (For i:= 1 to n-1 do begin If not empty(head1) then begin head:=head1; head1:=nil; end; For j:= n downto i+1 do begin If not empty(head1) then begin head:=head1; head1:=nil; end; If x>x1 then begin push(head1,x); push(head1,x1); end else begin push(head1,x1); push(head1,x); end; If j<n then begin For k:= 1 to n-j do begin pop(head1,y); push(head1,y); end; end; pop(head1,x); writeln('stack[',i,'] = ',x); end;
    • Увеличение счетчика операций на 1.
  7. Вывод результатов:
    • Вывод времени выполнения программы (t2-t1);
    • Вывод количества операций (ch);
    • Чтение строки от пользователя (readln).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.231 из 5
Похожие ответы