Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Protected






    fHead: pItem; // поле - указатель на вершину стека

    fSize: Word; // поле - число элементов стека

    Public

    property Size: Word read fSize; // свойство - число элементов стека

    procedure Push(v: tValue); // включение элемента со значением v

    function Pop: tValue; // исключение верхнего элемента стека

    function Empty: Boolean; // возвращение true, если стек пуст

    function TopValue: tValue; // возвращение значения верхнего элемента

    procedure Clear; // очистка стека

    constructor Create; // конструктор - создание пустого стека

    destructor Destroy; override; // деструктор - удаление стека

    end; // tStack

    Свойство Size доступно только для чтения. Конструктор Create выполняет операции fHead: =nil и fSize: =0. Деструктор Destroy вызывает метод Clear для удаления элементов стека из памяти. Метод Push включает элемент в вершину стека и увеличивает число элементов стека на 1. Метод Pop исключает элемент из вершины стека и уменьшает на 1 размер стека.

    4. Реализация основных операций над стеком

    Включение элемента со значением v в стек:

    Одинарными линиями показаны связи в исходном состоянии стека, пунктирными – связи, устанавливаемые в процессе выполнения операции. Сначала организуется вспомогательная динамическая переменная с указателем NewItem типа pItem. В поле значения этой переменной записывается значение нового элемента стека, в поле ссылки – адрес верхнего элемента стека, на который указывала ранее переменная fHead. Затем указатель fHead получает значение адреса вновь созданного элемента стека.

    Реализация метода включения элемента в стек:

    procedure tStack.Push(v: tValue);

    Var

    NewItem: pItem; // указатель на новый элемент

    Begin

    NewItem: = New(pItem); // выделение памяти под новый элемент стека

    NewItem^.Value: = v; // запись v в поле значения нового элемента

    NewItem^.Next: = fHead; // fHead -> в поле ссылки нового элемента

    fHead: = NewItem; // перемещение fHead на новый элемент

    Inc(fSize); // увеличение числа элементов стека на 1

    end; //procedure tStack.Push

    Исключение элемента из стека. Сначала читается значение верхнего элемента стека. Затем в переменную DisItem типа pItem из указателя fHead переписывается адрес верхнего элемента стека. Указатель fHead перемещается на элемент стека, следующий за выталкиваемым, и освобождается занимаемая исключаемым элементом память. Схема исключения:

    Реализация метода исключения элемента из стека:

    function tStack.Pop: tValue;

    // Исключение верхнего элемента из стека и возвращение его значения

    Var

    DisItem: pItem; // указатель на исключаемый элемент

    Begin

    Pop: = fHead^.Value; // чтение верхнего элемента стека

    DisItem: = fHead; // получение адреса исключаемого элемента

    fHead: = fHead^.Next; // перемещение вершины на следующий элемент

    Dispose(DisItem); // удаление из памяти бывшего верхнего элемента

    Dec(fSize); // уменьшение числа элементов стека на 1

    end; // function tStack.Pop

    Операция Pop неприменима к пустому стеку, поэтому перед ее выполнением необходимо проверять значение признака «стек пуст».

    Выработка признака «стек пуст» выполняется следующим образом:

    function tStack.Empty: Boolean;

    // Возвращает Empty=True, если стек пуст

    Begin

    Empty: = fHead = nil;

    end; // function tStack.Empty

    5. Использование стека для преобразования
    форм записи выражений.

    В инфиксной записи операция разделяет два операнда, в постфиксной – операция следует за двумя операндами, в префиксной – операция предшествует двум операндам. Например:

    Инфиксная запись Постфиксная запись Префиксная запись
    A+B AB+ +AB
    A+B–C AB+C– +A–BC
    A*B+C AB*C+ +*ABC
    A+B*C ABC*+ +A*BC
    (A+B)*C AB+C* *+ABC

    v Перевод из инфиксной формы записи выражения в постфиксную (польскую). Инфиксное выражение сканируется слева направо, и в зависимости от вида очередного элемента выражения выполняется одно из следующих действий:

    Элемент выражения Действие
    Открывающая скобка Вталкивание элемента в стек.
    Операнд Запись элемента в постфиксную строку.
    Закрывающая скобка Выталкивание элементов из стека до первой открывающей скобки и запись их в постфиксную строку, затем выталкивание самой открывающей скобки без записи ее в постфиксную строку. Если перед выполнением этой операции стек оказался пустым, значит, для данной закрывающей скобки не было парной открывающей, т.е. возникла исключительная ситуация.
    Операция Если стек не пуст, и приоритет операции ниже (£), чем у верхней операции в стеке, то выталкивание элементов из стека до операции с меньшим приоритетом или до опустошения стека и запись их в постфиксную строку; в противном случае стек не изменяется. Затем вталкивание операции в стек.

    После просмотра выражения выталкиваются из стека и записываются в постфиксную строку все оставшиеся в стеке операции.

    v Вычисление значения выражения по его постфиксной записи.

    Постфиксное выражение сканируется слева направо и обрабатывается следующим образом:

    Элемент выражения Действие
    Операнд Вталкивание элемента в стек
    Операция Выталкивание из стека двух элементов, выполнение операции с ними, запись результата в стек, если стек не пуст.

    v Перевод из инфиксной формы записи выражения в префиксную.

    Инфиксное выражение сканируется справа налево, и префиксная строка строится также справа налево. Алгоритм преобразования такой же, как и при преобразовании в постфиксную форму, только открывающие скобки меняются на закрывающие и, наоборот, при определении приоритета операции «£» изменяется на «<», чтобы равноприоритетные операции выполнялись слева направо.

    v Вычисление значения выражения по его префиксной записи.

    Алгоритм вычисления полностью совпадает с алгоритмом вычисления по постфиксной записи, но префиксная строка сканируется справа налево.

    6. Очередь

    Очередью называется упорядоченный набор элементов, которые могут исключаться с одного ее конца (называемого началом очереди), а включаться с другого конца (называемого концом очереди). Каждый элемент очереди характеризуется одним и тем же набором полей. Логическая структура очереди:

    Исключение A B C D E Включение
                 
      Начало   Конец  

    Очередь функционирует по принципу FIFO (First InFirst Out: «первым пришел – первым исключается»). В реальном мире имеется множество примеров очередей: очередь к кассе магазина, очередь задач, обрабатываемых вычислительной машиной. Каждый элемент очереди может содержать одно или несколько полей, число элементов в очереди не ограничено. Очередь, не содержащая ни одного элемента, называется пустой.

    7. Операции над очередью

    Над очередью q (от англ. queue – очередь) могут быть выполнены следующие операции:

    1) включение нового элемента v в конец очереди – Insert (q, v);

    2) исключение элемента из начала очереди – Remove (q) и возвращение его значения;

    3) выработка признака «очередь пуста» – Empty (q);

    4) считывание первого элемента без его удаления – HeadValue (q);

    5) считывание последнего элемента очереди – RearValue (q);

    6) определение числа элементов очереди Size (q);

    8) очистка очереди – Clear (q).

    Первые три операции над очередью являются основными. Операции Empty, Size, и Clear для очереди аналогичны соответствующим операциям для стека.

    8. Дек

    Деком (DEQ – от английского double ended queue, очередь с двумя концами) называется упорядоченный набор элементов, включение и исключение элементов в котором могут осуществляться с любого из двух его концов. Логическая структура дека:

    Включение Исключение – • A B C D E – • Исключение Включение
                 
      Начало   Конец  

    Частные случаи дека – дек с ограниченным входом и дек с ограниченным выходом (включение или исключение элементов осуществляется только с одного из концов дека).

    9. Операции над деком

    Над деком d могут быть выполнены все операции, определенные для очереди q, а также добавляются две основные операции:

    – включение элемента со значением v в начало дека – Push (d, v);

    – исключение элемента из конца дека – Delete (d) и возвращение его в качестве значения функции.

    10. Реализация очереди и дека

    Реализация очереди (дека) с помощью динамических переменных:

    При этом вводятся две переменные типа указателя на элемент очереди или дека: Head – на начало, Rear – на конец очереди или дека. В поле ссылки последнего элемента записывается значение nil.

    Описание классов tQueue и tDEQ – наследников класса tStack – может быть следующим:

    Type

    // Описание класса tQueue

    tQueue = class (tStack) // класс - очередь






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.