Организация стеков

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 23.05.2021
Размер файла 127,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего образования «Чувашский государственный университет имени И.Н. Ульянова»

Факультет информатики и вычислительной техники

Кафедра математического и аппаратного обеспечения информационных систем

Расчетно-графическая работа

на тему: «Организация стеков»

Выполнил:

Ст. группы ИВТ-21-20

Иванова Т.А.

Проверил:

Зав. кафедрой МиАОИС

Ильин Д.В.

Чебоксары, 2020

Оглавление

  • стек библиотека абстрактный
  • Введение
  • 1. Основные сведения
  • 2. Применение стеков
    • 3. Свойства
    • 4. Методы реализации стека
  • 5. Реализация стека
    • 6. Решение задачи со скобочной последовательностью без использования библиотеки stack
    • 7. Решение задачи со скобочной последовательностью с применением библиотеки stack
    • 8. Задача с сайта acmp.ru
  • Заключение
  • Список литературы

Введение

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

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

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

В 1946 Алан Тьюринг ввёл понятие стека. А в 1957 году немцы Клаус Самельсон и Фридрих Л. Бауэр запатентовали идею Тьюринга.

В некоторых языках (например, Lisp, Python) стеком можно назвать любой список, так как для них доступны операции pop и push. В языке C++ стандартная библиотека имеет класс с реализованной структурой и методами и т. д.

1. Основные сведения

Стек является одной из наиболее используемых и наиболее важных структур данных. Он применяются очень часто:

· Распознавание синтаксиса в компиляторе;

· Оценка выражений;

· Передачи параметров функциям;

· Выполнение вызова функции;

· Возврат из функции;

Стек, чаще всего, реализуется на основе обычных массивов, односвязных и двусвязных списков. В зависимости от конкретных условий, выбирается одна из этих структур данных. Он предназначен для хранения элементов, доступных естественным путём в вершине стека, например: стопка подносов или груда тарелок.

В стеке нет индексов как в массиве, а значит вы не можете обратиться к определенному элементу. Всё потому что, стек построен на связных списках.

Это значит, что каждый элемент (кроме последнего - он показывает на NULL, если простыми словами, то на ничего) имеет указатель на следующий элемент. Но есть элемент, на который нет указателя - первый (или как его еще называют головной).

Операции со стеком:

· добавление элемента;

· удаление элемента;

· чтение верхнего элемента;

Kогда стек достигает максимального количества элементов, наступает ситуация полноты стека (stack full) - в случае использования массивов.

Другая крайность - нельзя взять поднос с пустой полки. Условие пустого стека (stack empty) подразумевает, что нельзя удалить\извлечь элемент.

В языках программирования три операции, обычно дополняются и некоторыми другими.

Список функций C++ для работы со стеком:

• добавить элемент - push();

• удалить элемент - pop();

• получить верхний элемент - top();

• размер стека - size();

• проверить стек на наличие элементов - empty();

Данные функции входят в стандартную библиотеку шаблонов C++ - STL, а именно в контейнер stack.

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

#include <stack>

в функции описывается:

stack <тип данных> имя стека;

Рассмотрим подробнее функции для работы со стеком.

1. Push()

Функция push() ставит значение на вершину стека. Например:

st.push(1); // - на вершине число 1

st.push(2); // - на вершине число 2

st.push(3); // - на вершине число 3

2. Pop()

Функция pop() удаляет значение с вершины, то есть удаляет последний элемент.

// - изначально стек 138

st.pop(); // осталось 13

st.pop(); // осталось 1

3. Top()

Функция top() получает значение верхнего элемента, не удаляя его.

// изначально стек 138

int a = st.top(); // a =8;

4. Size()

Функция size() возвращает количество элементов в стеке.

// изначально стек 131331

int a = st.size(); // a = 6;

5. Empty()

Булева функция empty() дает понять пуст стек или нет. Возвращает true в случае, если стек пуст.

// Программа выведет верхний элемент если он есть, иначе выведет сообщение о том, что стек пуст.

if (st.empty())

cout << "Stack is empty";

else

cout << st.top();

2. Применение стеков

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

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

Вычисление выражений.

Стек используется для оценки префиксных, постфиксных и инфиксных выражений.

Преобразование выражений.

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

Синтаксический разбор.

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

Поиск с возвратом.

Предположим, что мы должны найти путь в лабиринте для решения проблемы. Мы выбираем путь и после этого понимаем, что этот путь неправильный. Теперь нам нужно вернуться к началу пути, чтобы начать новый путь. Это может быть сделано с помощью стека.

Проверка скобок.

Стек используется, чтобы проверить правильность открытия и закрытия скобок.

Реверсирование строки.

Стек используется для смены строки. Мы посылаем символы строки по одному в стек, а затем символы всплывают из стека.

Вызов функции.

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

3. Свойства

Count

Получает число элементов, содержащихся в интерфейсе Stack.

IsSynchronized

Возвращает значение, показывающее, является ли доступ к коллекции Stack синхронизированным (потокобезопасным).

SyncRoot

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

4. Методы реализации стека

Clear()

Удаляет все объекты из Stack.

Clone()

Создает неполную копию Stack.

Contains(Object)

Определяет, входит ли элемент в коллекцию Stack.

CopyTo(Array, Int32)

Копирует Stack в существующий одномерный массив Array, начиная с указанного индекса массива.

Equals(Object)

Определяет, равен ли заданный объект текущему объекту. (Наследуется от Object.)

GetEnumerator()

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

GetHashCode()

Возвращает перечислитель IEnumerator для словаря Stack.

GetType()

Служит хэш-функцией по умолчанию. (Наследуется от Object.)

MemberwiseClone()

Возвращает объект Type для текущего экземпляра. (Наследуется от Object.)

Peek()

Создает неполную копию текущего объекта Object.(Наследуется от Object.)

Pop()

Возвращает объект в верхней части Stack без его удаления.

Push(Object)

Удаляет и возвращает объект, находящийся в начале Stack.

Synchronized(Stack)

Вставляет объект как верхний элемент стека Stack.

ToArray()

Возвращает синхронизированную (потокобезопасную) оболочку для Stack.

ToString()

Копирует Stack в новый массив.

5. Реализация стека

Реализация простых функций стека без использования библиотеки

#include

<iostream>

using namespace std;

int stck[100]; //массив стека

int s=0;

int push (int x) //Функция ставит значение на вершину стека

{

stck [s] = x;

s++;

}

int pop () //Функция удаляет значение с вершины

{

return stck [s--];

}

// проверяет, пуст ли стек

bool isempty() {return s == 0;}

int top(int a) { cout << stck [s-1];}

int main()

{

int p;

push (15);

push (54);

push (87);

pop ();

isempty();

top (p);

return 0;

}

Результат:

Реализация простых функций стека с применением библиотеки

#include <iostream>

#include <stack>

using namespace std;

// Реализация стека на C ++ с использованием std:: stack

int main()

{

stack<string> s;

s.push("A");

s.push("B");

s.push("C");

s.push("D");

// Возвращает количество элементов в стеке

cout << "Размер стека " << s.size() << endl;

// Выводит верхний элемент

cout << "Верхний элемент: " << s.top() << endl;

s.pop(); // удаление верхнего элемента ("D")

s.pop(); // удаление следующего верхнего элемента ("C")

cout << "Размер стека " << s.size() << endl;

// проверяет, пуст ли стек

if (s.empty())

cout << "Стек пуст\n";

else

cout << "Стек не пуст\n";

return 0;

}

Результат:

6. Решение задачи со скобочной последовательностью без использования библиотеки stack

#include <iostream>

#include <cstring>

using namespace std;

int stack[1000];

int l=0;

void push(int x){

l++;

stack[l]=x;

}

int pop() {

l--;

return stack[l];

}

int main()

{

setlocale(LC_ALL,"rus");

int n=0;

string s;

cin>> s;

for (int i=0;i<s.size();i++) {

if (s[i]=='(') {

push(s[i]);

}

if (s[i]==')') {

if (l==0)

n=1;

if (l!=0 && stack[l]=='(')

pop();

}

if (s[i]=='[') {

push(s[i]);

}

if (s[i]==']') {

if (l==0)

n=1;

if (l!=0 && stack[l]=='[')

pop();

}

if (s[i]=='{') {

push(s[i]);

}

if (s[i]=='}') {

if (l==0)

n=1;

if (l!=0 && stack[l]=='{')

pop();

}

if (s[i]=='<') {

push(s[i]);

}

if (s[i]=='>') {

if (l==0)

n=1;

if (l!=0 && stack[l]=='<')

pop();

}

}

if(n==0 && l==0) cout<<"Правильная скобочная последовательность";

if(n==1 || l!=0) cout<<"Неправильная скобочная последовательность";

}

Результаты:

7. Решение задачи со скобочной последовательностью с применением библиотеки stack

#include<iostream>

#include <stack>

#include <cstring>

using namespace std;

int main()

{

setlocale(LC_ALL,"rus");

string s;

cin>> s;

stack<char>stack;

int n=0;

for (int i=0;i<s.size();i++) {

if (s[i]=='(') {

stack.push(s[i]);

}

if (s[i]==')') {

if (stack.empty())

n=1;

if (!stack.empty()&&stack.top()=='(')

stack.pop();

}

if (s[i]=='[') {

stack.push(s[i]);

}

if (s[i]==']') {

if (stack.empty())

n=1;

if (!stack.empty()&&stack.top()=='[')

stack.pop();

}

if (s[i]=='[') {

stack.push(s[i]);

}

if (s[i]==']') {

if (stack.empty())

n=1;

if (!stack.empty()&&stack.top()=='[')

stack.pop();

}

if (s[i]=='[') {

stack.push(s[i]);

}

if (s[i]==']') {

if (stack.empty())

n=1;

if (!stack.empty()&&stack.top()=='[')

stack.pop();

}

}

if(n==0&&stack.empty())

cout<<"Правильная скобочная последовательность";

if(n==1||!stack.empty())

cout<<"Неправильная скобочная последовательность ";

}

Результаты:

8. Задача с сайта acmp.ru

Условие задачи:

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

Это относится и к главе Ордена джедаев магистру Йоде, известному нам своими подвигами в «Звездных войнах». На первый взгляд может показаться, что спичрайтеру Йоды приходится тяжелее других: все-таки речь магистра своеобразна и ее изучение требует серьезных усилий. На самом деле все несколько проще. Спичрайтеру Йоды достаточно сначала придумать речь для обычного человека, после чего поменять порядок слов в каждом предложении на обратный. В силу того, что алгоритм преобразования обычной речи в речь магистра Йоды достаточно однообразен, спичрайтер решил автоматизировать этот процесс и попросил Вас написать программу, которая будет преобразовывать речь, составленную им для обычного человека в речь для Йоды.

Решение:

Будем считывать по одному слову и складывать их в стек. Как только в конце очередного слова точка, следует вывести все слова из стека (в обратном порядке, именно поэтому и используется стек). А считывание продолжить дальше.

#include <iostream>

#include <cstdio>

#include <cstring>

#include <stack>

using namespace std;

int main(){

//Считываем данные из файла

freopen("input.txt", "r", stdin);

//Записываем данные в файл

freopen("output.txt", "w", stdout);

string str;

stack<string> st;

bool f=false;

while(cin>>str){

if(str[str.size()-1]=='.'){

str=str.substr(0, str.size()-1);

if(f) cout<<" ";

else f=true;

cout<<str;

while(!st.empty()){

cout<<" "<<st.top();

st.pop();

}

cout<<".";

}else st.push(str);

}

return 0;

}

стек библиотека абстрактный

Заключение

В некотором смысле, стеки являются частью фундаментального языка информатики. Концептуально, структура данных - стек очень проста: она позволяет добавлять или удалять элементы в определенном порядке. Каждый раз, когда добавляется элемент, он попадает на вершину стека, единственный элемент, который может быть удален из стека - элемент, который находится на вершине стека. Таким образом, стек, как принято говорить, «первым пришел, последним ушел - FILO» или «последним пришел, первым ушел - LIFO». Первый элемент, добавленный в стек, будет удален из него в последнюю очередь.

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

Список литературы

1. Свободная энциклопедия Википедия https://ru.wikipedia.org/wiki/Стек

2. КОД |Журнал Яндекс практикума https://thecode.media/stack/

3. Национальный исследовательский университет «Высшая школа экономики». Факультет компьютерных наук. Летняя школа по компьютерным наукам. Август. 2016. Параллель С. Шуйкова И.А. Лекция 1. http://shujkova.ru/sites/default/files/lec1.pdf

4. Сайт Programmado - блог начинающих программистов http://programmado.ru/51-stackc.html

5. Code Lessons https://codelessons.ru/cplusplus/realizaciya-steka-stack-v-c.html

6. БЛОГ Web Программиста http://juice-health.ru/programming/503-primenenie-steka

7. Software Testing Help https://www.softwaretestinghelp.com/stack-in-cpp/

Размещено на Allbest.ru

...

Подобные документы

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

    презентация [591,2 K], добавлен 22.10.2013

  • Алгоритмы работы памяти ЭВМ. Исследование стеков типа LIFO и FIFO. Назначение сигналов для работы со стеком LIFO и используемая элементная база для построения функциональной схемы. Исследование ассоциативного запоминающего устройства и двухпортового ОЗУ.

    лабораторная работа [1,7 M], добавлен 22.07.2012

  • Создание стека с помощью языка программирования C#. Блок-схема работы алгоритма программы, ее интерфейс. Добавление, удаление и вывод элементов в стеке. Реализация методов "Начало-конец" (переприсвоение индексов) и "Приоритет" (сортировка по возрастанию).

    лабораторная работа [924,7 K], добавлен 26.12.2014

  • Создание стека как линейного списка. Использование аналогичного ссылочного типа для организации очереди. Циклически связанный список. Построение сложных структур в динамической памяти. Бинарные (двоичные) деревья. Экран результата и контрольные расчеты.

    лабораторная работа [398,9 K], добавлен 14.06.2009

  • Использование метода абстракции в программировании на примере построения польской записи выражения с помощью стека. Абстрактные типы данных. Анализ классов реализации списков. Вставка и удаление элемента в список. Вычисление значения выражения на стеке.

    презентация [166,7 K], добавлен 19.10.2014

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

    курсовая работа [254,3 K], добавлен 20.05.2013

  • Особенности организации передачи данных в компьютерной сети. Эталонная модель взаимодействия открытых систем. Методы передачи данных на нижнем уровне, доступа к передающей среде. Анализ протоколов передачи данных нижнего уровня на примере стека TCP/IP.

    курсовая работа [1,0 M], добавлен 07.08.2011

  • Разработка алгоритмов на динамических структурах данных. Описание структуры данных "стек". Процедуры добавления и удаления элемента, очистки памяти. Код распечатки содержимого всего стека. Инструкция пользователя, код программы, контрольный пример.

    курсовая работа [22,9 K], добавлен 19.10.2010

  • Анализ проблемы детализации событий, возникающих в ходе работы IT-инфраструктуры, ее решение через использование стека ELK как сбора журнальных файлов. Реализация ELK стека в инфраструктуре современного веб-сервиса, карта расположения пользователей в ней.

    статья [1,5 M], добавлен 10.12.2016

  • Многоуровневая структура стека TCP/IP. Уровень межсетевого взаимодействия. Основной уровень. Прикладной уровень. Уровень сетевых интерфейсов. Соответствие уровней стека TCP/IP семиуровневой модели ISO/OSI. Проектирование локальной вычислительной сети.

    курсовая работа [645,2 K], добавлен 04.03.2008

  • Створення динамічних структур та списку шляхом додавання елементів в кінець списку, шляхом вставляння елемента в середину списку. Відмінності стека від списку, основні операції із стеком. Формування та основні операції над кільцем, обхід кільця.

    реферат [170,8 K], добавлен 07.09.2011

  • Типовые структуры блок-схем алгоритмов обработки данных на языке "Ассемблер" для простых микропроцессорных систем управления различными процессами. Реализация типовых функций управления, ее принципы и закономерности, правила графического оформления.

    методичка [572,8 K], добавлен 02.10.2010

  • Определение программного модуля. Принципы использования dll-библиотеки. Преимущества и недостатки использования dll-библиотек. Описание коэффициентов моделей. Разработка структуры классов. Реализация библиотеки классов в среде разработки MS Visual Studio.

    дипломная работа [676,6 K], добавлен 16.06.2015

  • Технические различия между операционными системами UNIX и Linux. Архитектура аппаратного обеспечения и ядро ОС. Поддержка файловой системы. Доступность приложений. Системное администрирование. Разработка программы на языке Си, реализующей алгоритм стека.

    курсовая работа [1,0 M], добавлен 28.05.2015

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

    курсовая работа [2,5 M], добавлен 17.09.2011

  • Понятие информационных систем и их классификация, типы и история развития, структура и компоненты. Создание информационной модели и обоснование выбора модели данных. Внутренняя среда предприятия, организация на нем документооборота. Средства базы данных.

    курсовая работа [1,0 M], добавлен 17.04.2016

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

    презентация [130,3 K], добавлен 21.06.2014

  • Общая характеристика данных. Список как простейшая линейная структура данных. Табличные структуры данных (матрицы). Принцип действия метода дихотомии. Основные режимы обработки данных. Расчет отчислений в фонды по каждому сотруднику с помощью MS Excel.

    курсовая работа [1,6 M], добавлен 21.10.2009

  • Построение базы данных для экзаменационных ведомостей. Работа с таблицами, создание простых форм, отчетов и запросов (Query by Example). Использование информации из нескольких, связанных между собой таблиц. Запросы с использованием статистических функций.

    практическая работа [39,1 K], добавлен 24.06.2009

  • Линейный односвязный список (ЛОС) из введенных данных с клавиатуры с заданным указателем sag, работающий с типом данных Integer. Вывод информационных сообщений. Подсчет количества идентичных по содержанию элементов. Ввод данных в диалоговом режиме.

    лабораторная работа [36,3 K], добавлен 03.03.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.