260 likes | 493 Views
Стек ( Stack, Pinu, LIFO). Стек является одной из наиболее используемых и наиболее важных структур данных. Стеки применяются очень часто : Stekke kasutatakse väga tihti : Распознавание синтаксиса в компиляторе (kompilaatori süntaksi hindamine) -Оценка выражений ( avaldise hindamine)
E N D
Стек (Stack, Pinu, LIFO) • Стек является одной из наиболее используемых и наиболее важных структур данных. Стеки применяются очень часто: • Stekke kasutatakse väga tihti: • Распознавание синтаксиса в компиляторе(kompilaatori süntaksihindamine) • -Оценка выражений (avaldise hindamine) • Передача параметров функциям (funktsioonide parameetrite edastamine) • -Выполнение вызова функции(funktsioonide väljakutsumine) • -Возврат из функции(tagastamine funktsioonidest)
Стек предназначен для хранения элементов, доступных естественным путём в вершине стека, например: • Стопка подносов(kandikud pakis) • Груда тарелок (taldrikud pakis) • Шампур с нанизанными овощами (šašlõkivarras juurviljadega) • Oперациисо стеком: (operatsioonid stekiga) • - добавляющие (Push) lisamine • - удаляющие / извлекающие (Pop) eemaldamine/kustutamine. • Kогда стек достигает максимального количества элементов, наступает ситуация полноты стека (stack full) – в случае использования массивов. • Другая крайность – нельзя взять поднос с пустой полки. Условие пустого стека (stack empty) подразумевает, что нельзя удалить\извлечь элемент.
Помещение в стек и извлечение из стека. Lisamine ja kustutamine stekist. C C B B B D B А A A A A A Push A Push B Push C Pop Pop Push D
Объявление объекта типа Stack. Steki deklareerimine. struct Solm { <тип>info;//andmed Solm *next;//järgmise elemendi aadress }; Каждый элемент стека состоит из 2-х полей: информационного и адресного sõlm sõlm Адрес следующего узла Адрес следующего узла данные данные
Указатель на вершину стека. Tipu steki viit. Esim Solm *Esim; Sõlm Sõlm Sõlm Sõlm
Создание пустого стека. Tühja steki koostamine. Esim=NULL;//stekk on tühi NB! NULL – это не нулевой адрес, а отсутствие конкретного адресапамяти. NULL on mälu aadressi puudumine.
Добавление первого элемента в стек. Esimese elemendi lisamine. Esim Р NULL andmed p=new Solm; //mälu esiletõstmine p->info=andmed; //kirjutame andmed p->next=NULL;//järgmine puudub Esim=p; //tipu stekiks saab uus element
Добавление следующего элемента. Järgmise elemendi lisamine. P =new Solm; p->info=andmed; //kirjutame andmed p->next=Esim; //järgmine on kunagine element Esim=p; //esimene sai uueks elemendiks Esim Р NULL andmed andmed
Удаление элемента из вершины стека. Elemendi kustutamine steki tipust. Esim NULL p p=Esim; //viit p teab esimese elemendi aadressi Esim=p->next; //tipu element on järgmine element delete p; //kustutada element
Пример применения стека.Steki/Pinu kasutamise näidis. • Выражение(avaldis) • -8 + (4 * 12 + 5^2) / 3 • cодержит(sisaldab): • Унарный (unaarne) оператор – (минус) • Бинарные (binaarsed) операторы +, *, /, ^(степень/aste) • Операнды(operandid) 8, 4, 12, 5, 2, 3 • Круглые скобки (sulud)
Пример применения стека(продолжение). Выражение записывается в инфиксной (infix) форме, если каждый бинарный оператор помещается между его операндами и каждый унарный оператор предшествует его операнду. Avaldis on infix vormis, kui binaarne operaator asub operantide vahel, ning unaarne operaator asub operantide ees. Например, выражение -2 + 3 * 2 является инфиксным. Avaldis -2 + 3 * 2 on infix vormis.
Пример применения стека. Инфиксное выражение вычисляется алгоритмом, который использует два стека для различных типов данных. Infix avaldist arvutatakse algoritmi abil, mis kasutab kahtestekki. • Для хранения операндов (operantide hoidmiseks); 2.Для хранения операторов (operaatori hoidmiseks).
Пример применения стека. Альтернативой рассмотренной форме является постфиксное (postfix) представление, в котором операнды предшествуют оператору. Kui operandid eelnevad operaatorile, siis avaldis on postfix vormis. Например, инфиксное выражение «А+В» записывается в постфиксной форме как «А В +». Näiteks, infix avaldis «А+В» on postfix vormis «А В +». infix: a+b*c=a+(b*c) postfix: a b c * +
Пример применения стека. А * В + С АВ*С+ * С + А В Стек 1 * Стек 2 +
Пример применения стека. Infix Postfix A * B + C A B * C + A * B * C *D *E *F A B * C * D * E * F* A + (B * C + D) / E A B C * D + E / + (B*B–4 *A*C)/(2*A) B B * 4 A * C * – 2 A * / В постфиксной форме переменные и числа вводятся по мере их появления, а оператор – там, где имеются 2 его операнда.
Постфиксное выражение оценивается алгоритмом, который просматривает выражение слева направо и использует стек. Читаем каждый терм и в зависимости от его типа выполняем действия. Инфиксное выражение 4+3*5 записывается в постфиксной форме как 4 3 5 *+ 5 5*3=15 3 3 15+4=19 4 4 4 4 Push 3 Push 5 Push 4 Pop Pop
Как работает электронный калькулятор? Kuidas töötab kalkulaator? Пользователь вводит математическое выражение с числами (операндами) и операторы. Kasutaja sisestab avaldis numbritega ja tehted. Калькулятор использует один стек для вычисления числовых результатов. Kalkulaator kasutab ühte stekki tulemuste avaldamiseks.
Описание программы, реализующей работу со стеком. Programmi kirjeldamine. Функции (funktsioonid): • Добавление элемента в вершину стека(lisamine) • Удаление элемента из вершины стека(eemaldamine) • Удаление всех элементов из стека с освобождением памяти(kõikide elementide eemaldamine) - Вывод на экран содержимое стека(väljastamine ekraanile) Main() : инициализация вершины стека, вызов функций (steki tipu initsialiseerimine, funktsioonide väljakutsumine)
Добавление элемента в вершину стека.Elemendi lisamine.void Push(<тип> <элемент>); Функция получает в качестве параметра значение нового элемента и сохраняет его в вершине стека. Funktsioon kirjutab oma parameetri <элемент>stekitippu.
p=new Solm; //malu uuele elementile int andmed; //muutuja cout<<"Uus element? "; cin>>andmed; //kui lisame esimene element if (Esim==NULL) { p->info=andmed; // p->next=NULL; //jargmine puudub Esim=p; //Esim teab nuud aadres //1.elem } else //kui stekkis on juba elementid { p->info=andmed; p->next=Esim; Esim=p;//uus element on esimene stekkis }
Удаление элемента из вершины стека. Elemendi eemaldamine steki tipust.<тип>Pop (); Функция удаляет элемент из вершины стека и возвращает значение этого элемента главной функции main(). Funktsioon eemaldab elemendi steki tipust.
if (Esim!=NULL){//eemaldame 1.elem tipust u=Esim; Esim=u->next; delete u;}else cout<<"Stack on tyhi"<<endl;
Удаление всех элементов из стека с освобождением памяти. Kõikide elementide eemaldamine void ClearStack(); В цикле пока стек не опустеет удаляются все его элементы и указатель на вершину стека получает значение NULL. Tsüklis eemaldatakse kõik elemendid kuni stekis on elemendid.
Вывод на экран всех элементов, содержащихся в стеке. Ekraanile väljastamine. void PrintStack(); Функция в цикле просматривает весь стек и выводит на экран значения поля info в каждом узле стека. Funktsioon analüüsib kogu stekki ja väljastab ekraanile info andmed igas steki sõlmes.
if (Esim!=NULL{ u=Esim; cout<<"Stekkis on elementid: "; cout<<u->info<<" "; while (u->next!=NULL) { u=u->next; cout<<u->info<<" "; }}//if Esim!=NULLelse { //stekk on tyhicout<<"Stekk on tyhi"<<endl; //igaks yhuks kui lisame veel element Esim=NULL;}
Задания. Ülesanded. • Составить программу, реализующую работу со стеком. Koostada programm, mis realiseerib töö stekiga. 2. Составить программу, моделирующую работу постфиксного калькулятора, имеющего операторы +, -, *, / и ^ (возведение в степень). Калькулятор принимает данные с плавающей точкой и вычисляет выражения. Koostada programm, mis modeleerib postfix kalkulaatori tööd, kasutades tehteid +, -, *, / ja ^ (astmed). Kalkulaator võtab vastu kümnendmurru andmed ja arvutab avaldised.