Пример вычисления выражений




16.

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

Очередь организована, в отличие от стека, согласно дисциплине обслуживания, FIFO: FIRST INPUT FIRST OUTPUT.

Очередь в программировании используется, как и в реальной жизни, когда нужно совершить какие-то действия в порядке их поступления, выполнив их последовательно. Примером может служить организация событий в Windows.

Существует несколько способов реализации очереди:

с помощью одномерного массива; с помощью связанного списка;

объявление структуры:

typedefstructnode_t {// Узел

intvalue;// Само значение

structnode_t* next; // Указатель на следующий элемент

}TNode;

typedefstructqueue_t {// Очередь

TNode* head; // Вершинаочереди

TNode* tail; // Хвост

}TQueue;

Функция удаления из очереди:

int Pop (TQueue* queue){

int value = 0;

TNode* node;

if (queue->head){ // Пока есть элементы в очереди

node = queue->head; // Сохраняем указатель на удаляемый элемент

value = node->value; // Сохраняем значение удаляемого элемента

queue->head = queue->head->next;// Вершиной очереди становится следующий за удаляемым элемент

free(node); // Окончательно удаляем элемент

}

returnvalue;

}

17.

Стек (или магазин) представляет собой список, упорядоченный по времени поступления элементов таким образом, что извне доступен только последний из записанных в список элементов, который называется вершиной стека. Другими словами, стек функционирует по принципу «последним пришел - первым ушел» (LIFO - LastInputFirstOutput).

Так как извне доступна только вершина стека, то основными операциями для стека являются:

выборка с одновременным удалением вершины стека;

добавление нового элемента в вершину стека.

Объявление элемента стека.

typedefstructnode{

char el;

struct node *next;

} Stack;

Глобальная переменная – указатель на вершину стека.

Stack* Head=NULL;

Добавлениевстек.

void Push(char element){

Stack *p;

p = (Stack*)malloc(sizeof(Stack));

if(p!=NULL){

p->el=element;

p->next=Head;

Head=p;

printf(“Push elem %c \n”,element);

}

else{

puts(“Error! Not free memory!”);

}

}

 

 


 

18.

Деком (англ. deque – аббревиатура от double-endedqueue, двухсторонняя очередь) называется структура данных, в которую можно удалять и добавлять элементы как в начало, так и в конец. Дек хранится в памяти так же, как и очередь.

Возможные действия с деком.

Добавить (положить) в начало дека новый элемент;

Добавить (положить) в конец дека новый элемент;

Извлечь из дека первый элемент;

Извлечь из дека последний элемент;

Узнать значение первого элемента (не удаляя его);

Узнать значение последнего элемента (не удаляя его);

Узнать количество элементов в деке;

Очистить дек (удалить из него все элементы);

Объявление

struct node {

int data;

int key;

struct node *next;

structnode *prev;

};

Глобальные переменные:

structnode *head = NULL;

struct node *last = NULL;

structnode *current = NULL;

Функция удаления элемента из начала.

struct node* deleteFirst() {

struct node *tempLink = head;

if(head->next == NULL){

last = NULL;}

else {

head->next->prev = NULL;

}

head = head->next;

returntempLink; }

19.

Обра́тнаяпо́льскаянота́ция (ОПН) — форма записи математических и логических выражений, в которой операнды расположены перед знаками операций. Также именуется как обратная польская запись,

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

Выражение в постфиксной форме (post-fix), которую еще называют обратной польской записью не имеет скобок, что позволяет не обращать внимания на приоритеты, связанные с ними. А за счет того, что все операнды расположены перед знаком операции, выражение можно вычислить последовательно, за один проход слева направо, что позволяет не учитывать приоритетов знаков операций.

Постфиксная форма записи7 5 2 - 4 * +

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

 


 

Правила перевода следующие

1. Ввести в стек левую скобку '('

2. Добавить в конец строки с инфиксным выражением правую скобку ')'

3. Пока стек не пуст, считываем символы из строки содержащей инфиксное выражение слева направо и выполняем следующие действия.

a. Если текущий символ в инфиксной строке – левая скобка, помещаем ее в стек.

b. Если текущий символ в инфиксной строке – правая скобка, извлекаем знаки операций из стека и вставляем их в результирующую строку, до тех пор пока на вершине стека не появиться левая скобка. Извлечь левую скобку и отбросить ее.

c. Если текущий символ в инфиксной строке – знак операции, извлекаем знаки операций из стека (если они там есть), пока соответсвующее им операции имеют равный или более высокий приоритет по сравнению с текущей операцией, и вставляем извлеченные знаки операций в результирующую строку. Вставим текущий символ в стек.

d. Если текущий символ в инфиксной строке – цифра, копируем его в результирующую строку

 

Пример перевода

Исходная инфиксная строка Стек Результат
4+2*7 пуст пуст
4+2*7) ( пуст
+2*7) (  
2*7) (+  
*7) (+ 4 2
7) (+ * 4 2
) (+ * 4 2 7
  (+ 4 2 7 *
  ( 4 2 7 * +
  пуст 4 2 7 * +

 


 

Общий порядок

Автоматизация вычисления выражений в обратной польской нотации основана на использовании стека. Алгоритм вычисления для стековой машины элементарен:

1. Обработкавходногосимвола

· Если на вход подан операнд, он помещается на вершину стека.

· Если на вход подан знак операции, то соответствующая операция выполняется над требуемым количеством значений, извлечённых из стека, взятых в порядке добавления. Результатвыполненнойоперациикладётсянавершинустека.

2. Если входной набор символов обработан не полностью, перейти к шагу 1.

3. После полной обработки входного набора символов результат вычисления выражения лежит на вершине стека.

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

Пример вычисления выражений

Инфиксное выражение {\displaystyle (1+2)\times 4+3}в ОПН может быть записано так: 1 2 + 4 × 3 +

Вычисление производится слева направо.


Ввод Операция Стек
  поместить в стек  
  поместить в стек 1, 2
+ сложение  
  поместить в стек 3, 4
* умножение  
  поместить в стек 12, 3
+ сложение  

Результат, 15, в конце вычислений находится на вершине стека.


 


 

Иерархические списки представляют собой несколько подсписков, ранжированных по уровням так, что эл-ты подсписка уровня 0 явл. головными эл-тами (или содержат ссылки на них) для подсписков уровня 1. Те в свою очередь явл. головными для подсписков уровня 2 и т.д.

т.e. эл-ты иерархического списка, кроме привычной информационной части содержат ссылку на головной эл-т нижнего подсписка.

При реализации такого списка основными характеристиками явл.:

1. Кол-во уровней

2. Кол-во подсписков на одном уровне

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

Поскольку в иерархическом списке присутствует большое кол-во ссылок, то изменятся и структуры, представляющие эл-ты списка.

typedefstruct item{

VAL data;

Struct item*next;

ITEM 1*sub;

}ITEM 0;

typedefstruct item{

VAL data;

struct item*next;

ITEM 2*sub;

}ITEM 1;

typedef{

VAL data;

struct item*next;

}ITEM 2;

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

Продолжение 21 вопроса:

эл-тов, в кот.начальное знач-е представляет собой ключ эл-та уровня 0, а все последующие явл. ключами соответствующих эл-тов нижележащих подсписков.

Назовем такую последовательность ключей спецификацией эл-тов иерархического списка.

Пример спецификации:

Intspec[4]={0,1,2,3}

0 – номер факультета, 1 – номер специальности, 2 – номер курса, 3 – номер группы

Push (int*spec, VAL new_data)

Pop (int*spec);

Кол-во значений, входящих в спецификацию эл-та, зависит от того, на каком уровне он расположен и может варьироваться от 0 для первого уровня, до N-1 для N-ого уровня.

Особенностью ф-ции удаления в иерархическом списке явл. необходимость рекурсивного удаления всех зависимых от удаляемого эл-та подсписков.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-09-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: