Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17898 / 3045 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 16:

Функции в примерах

< Лекция 15 || Лекция 16: 123456

Структуры данных

Решение комбинаторных задач предполагает выделение структур сложного типа с их последующей реализацией средствами выбранного языка программирования. При этом структура данных может не зависеть от конкретных языковых конструкций (абстрактная структура данных ).

Под структурой данных понимают совокупность элементов фиксированных типов и набор базисных операций, определяющих организацию и способ обработки данных.

Рассмотрим некоторые основные структуры данных.

Стеки

Стеком называется структура данных, загрузка или увеличение элементов для которой осуществляется с помощью указателя стека в соответствии с правилом LIFO ( last-in, first-out - последним введен, первым выведен).

Указатель стека sp (stack pointer) содержит в любой момент времени индекс (адрес) текущего элемента, который является единственным элементом стека, доступным в данный момент времени для работы со стеком (для случая, когда указатель стека всегда задает ячейку, находящуюся непосредственно над его верхним элементом).

  1. Начальная установка:
    sp=1;
  2. Загрузка элемента х в стек:
    stack[sp]=x;
    sp=sp+1;
  3. Извлечение элемента из стека:
    sp=sp-1;
    x=stack[sp];
  4. Проверка на переполнения и загрузка элемента в стек:
    if(sp<=sd) {stack[sp]=x;sp=sp+1}
    else// переполнение

    Здесь sd - размерность стека.

  5. Проверка наличия элементов и извлечение элемента стека:
    if (sp>1){sp=sp-1;x=stack[sp]} //антипереполнение
  6. Чтение данных из указателя стека без извлечения элемента:
    x=stack[sp-1];

Очереди

Очередь - одномерная структура данных, для которой загрузка или извлечение элементов осуществляется с помощью указателей начала ( head ) и конца ( tail ) очереди в соответствии с правилом FIFO ( first-in, first-out - первым введен, первым выведен).

  • Начальная установка:
    head=1; tail=1;
  • Добавление элемента:
    queue[tail]=x; tail=tail+1;
    if(tail>qd) tail=1;

    Здесь qd - размерность очереди.

  • Исключение элемента:
    x=queue[head]; head=head+1;
    if(head>qd) tail=1;
  • Проверка переполнения очереди и включение в нее элемента:
    temp=tail+1;
    if(temp=head)
    {Переполнение}
    else {queue[tail]=x; tail=temp}
  • Проверка наличия элементов и исключение элемента х:
    if(head==tail) { очередь пуста}
    else{ x=queue[head]; head=head+1;
    if(head>qd) head=1;}

Отметим, что, при извлечении элемента из очереди, все элементы могут также перемещаться на один шаг к ее началу.

< Лекция 15 || Лекция 16: 123456
Максим Сикстус
Максим Сикстус

При выполнении кода из Лекции 11, стр.2 получается результат:

x ravno 16.
x ravno 4.
x ravno 16.
x ravno 14.
x ravno 100.
x ravno 36.

Связано ли это с утверждением, что : "Единственным исключением при замене является макроопределение, находящееся внутри двойных кавычек"?

Андрей Белоусов
Андрей Белоусов

Я изучаю лекцию 5 и в ней есть выражения:

char *pc;

pc = (char*)0777;

Я так понял что, char *pc это ссылка на переменную pc,

0777 это тип int восьмиричный. А что делает выражение:

 pc = (char*)0777;