Skip to content

Latest commit

 

History

104 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

onescript-collection-stack

Реализация структуры данных Стек (LIFO — Last In, First Out) для OneScript.

Анимация добавления элементов в стек

Анимация получения элементов из стека

Возможности

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

Для pop() и peek() подобрать один русскоязычный вариант, идеально описывающий суть операции, оказалось непросто — на этих двух операциях в таблице ниже несколько равноправных синонимов. Используйте тот, что лучше звучит в вашем коде.

Методы Описание
push(значение)
Добавить(Значение)
Добавляет элемент на вершину стека
pop()
Извлечь()
Взять()
Забрать()
Следующий()
Удаляет и возвращает элемент с вершины стека. Бросает исключение, если стек пуст
peek()
Прочитать()
Вершина()
Верхний()
Заглянуть()
Возвращает элемент с вершины стека, не удаляя его. Бросает исключение, если стек пуст
count()
Количество()
Возвращает количество элементов в стеке
empty()
Пустой()
Возвращает Истина, если стек не содержит элементов
contains(значение)
Содержит(Значение)
Возвращает Истина, если указанное значение присутствует среди элементов стека
clear()
Очистить()
Удаляет все элементы из стека

Стек может хранить значения любого типа, включая объекты — pop()/peek() (и их алиасы) возвращают тот же самый объект, который был передан в push(), без копирования. contains()/Содержит() сравнивает значения строгим равенством: для примитивов (числа, строки и т.п.) — по значению, для объектов — по ссылке.

Установка

Рекомендуемый способ - с помощью менеджера пакетов opm:

opm install collection-stack

После установки библиотеки подключите ее в файле скрипта

#Использовать collection-stack

После этого в системе типов скрипта станет доступен тип Стек, можно будет создавать объекты: МойСтек = Новый Стек;.

Без opm — подключите файл src/stack.os в своём проекте как сценарий:

ПодключитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "src", "stack.os"), "Стек");

Использование

Стек = Новый Стек;

Стек.push(1);
Стек.push(2);
Стек.push(3);

Сообщить(Стек.count()); // 3
Сообщить(Стек.peek());  // 3, стек не изменился

Пока Не Стек.empty() Цикл
	Сообщить(Стек.pop());
КонецЦикла;
// выведет: 3, 2, 1

Стек.push(1);
Стек.clear();
Сообщить(Стек.empty()); // Истина

Стек.push(1);
Стек.push(2);
Сообщить(Стек.contains(2));  // Истина
Сообщить(Стек.contains(35)); // Ложь

То же самое через русскоязычный фасад (методы взаимозаменяемы на одном и том же объекте):

Стек = Новый Стек;

Стек.Добавить(1);
Стек.Добавить(2);
Стек.Добавить(3);

Сообщить(Стек.Количество()); // 3
Сообщить(Стек.Прочитать());  // 3, стек не изменился

Пока Не Стек.Пустой() Цикл
	Сообщить(Стек.Извлечь());
КонецЦикла;
// выведет: 3, 2, 1

Попытка получить элемент из пустого стека (pop()/Извлечь() или peek()/Прочитать()) бросает исключение с текстом stack underflow:

Стек = Новый Стек;

Попытка
	Стек.pop();
Исключение
	Сообщить(ОписаниеОшибки()); // stack underflow: attempt to get element out of empty stack object
КонецПопытки;

Тесты

Тесты находятся в tests/stack.os и написаны с использованием библиотек asserts и 1testrunner. Для запуска установите оба пакета через opm, затем выполните:

opm install asserts
opm install 1testrunner
1testrunner -runall tests

Лицензия

MIT

About

Implementation of stack data type object for OneScript language

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages