<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%82%D0%B5%D0%BA</id>
	<title>Стек - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%82%D0%B5%D0%BA"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;action=history"/>
	<updated>2026-07-16T09:56:45Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=9021&amp;oldid=prev</id>
		<title>imported&gt;Gromolyak: /* Программный стек */</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=9021&amp;oldid=prev"/>
		<updated>2026-02-10T16:30:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Программный стек&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{другие значения}}&lt;br /&gt;
[[Файл:Stack preview.svg|thumb|400px|Иллюстрация организации стека]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Стек&amp;#039;&amp;#039;&amp;#039; ([[МФА]]: &amp;#039;&amp;#039;/stɛk/&amp;#039;&amp;#039;) ({{lang-en|stack}} — стопка) — [[абстрактный тип данных]], представляющий собой [[Список (информатика)|список элементов]], организованных по принципу &amp;#039;&amp;#039;[[LIFO]]&amp;#039;&amp;#039; ({{lang-en|last in — first out}}, «последним пришёл — первым вышел»).&lt;br /&gt;
&lt;br /&gt;
Чаще всего принцип работы стека сравнивают со стопкой : чтобы взять вторую сверху, нужно сначала взять первую.&lt;br /&gt;
&lt;br /&gt;
В [[ЦВК|цифровом вычислительном комплексе]] стек называется магазином — по аналогии с [[Магазин (часть оружия)|магазином в огнестрельном оружии]] (стрельба начнётся с патрона, заряженного последним).&lt;br /&gt;
&lt;br /&gt;
В 1946 [[Тьюринг, Алан|Алан Тьюринг]] ввёл понятие стека&amp;lt;ref&amp;gt;{{cite web|url=http://abc.vvsu.ru/Books/ebooks_iskt/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B8/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%BE%D0%B2/%D0%A2%D0%B5%D0%BE%D1%80_%D0%B0%D0%B2%D1%82_%D1%82%D0%B5%D0%BC%D1%8B/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0%20%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D0%B0.htm|title=Машина Тьюринга: Введение|access-date=2013-02-12|archive-url=https://web.archive.org/web/20140320172056/http://abc.vvsu.ru/Books/ebooks_iskt/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B8/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%BE%D0%B2/%D0%A2%D0%B5%D0%BE%D1%80_%D0%B0%D0%B2%D1%82_%D1%82%D0%B5%D0%BC%D1%8B/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B0%20%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D0%B0.htm|archive-date=2014-03-20|url-status=live}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Книга|ссылка=https://books.google.ru/books?id=MIn1DAAAQBAJ&amp;amp;pg=PT36&amp;amp;lpg=PT36&amp;amp;dq=In+1946,+Alan+Turing+introduced+the+concept+of+stack.&amp;amp;source=bl&amp;amp;ots=-VILFtL-Ju&amp;amp;sig=ACfU3U1A52mE48ZF9P3SVAxvEBzci2QtZQ|автор=Ali Almossawi|заглавие=Bad Choices: How Algorithms Can Help You Think Smarter and Live Happier|год=2017-04-04|издательство=John Murray Press|страниц=140|isbn=978-1-4736-5075-6|archive-date=2022-08-07|archive-url=https://web.archive.org/web/20220807062146/https://books.google.ru/books?id=MIn1DAAAQBAJ&amp;amp;pg=PT36&amp;amp;lpg=PT36&amp;amp;dq=In+1946,+Alan+Turing+introduced+the+concept+of+stack.&amp;amp;source=bl&amp;amp;ots=-VILFtL-Ju&amp;amp;sig=ACfU3U1A52mE48ZF9P3SVAxvEBzci2QtZQ}}&amp;lt;/ref&amp;gt;. А в 1957 году немцы Клаус Самельсон и Фридрих Л. Бауэр запатентовали идею Тьюринга&amp;lt;ref&amp;gt;{{cite web|url=http://worldwide.espacenet.com/publicationDetails/originalDocument?CC=DE&amp;amp;NR=1094019&amp;amp;KC=&amp;amp;FT=E|title=Немецкий патент|access-date=2013-02-12|archive-url=https://www.webcitation.org/6ERYlTWAH?url=http://worldwide.espacenet.com/publicationDetails/originalDocument?CC=DE|archive-date=2013-02-15|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В некоторых языках (например, [[Lisp]], [[Python]]&amp;lt;ref&amp;gt;{{cite web|url=http://www.ibm.com/developerworks/ru/library/l-python_part_3/index.html|title=Python списки: Встроенные функции|access-date=2013-02-12|archive-url=https://www.webcitation.org/6ERYlx0vo?url=http://www.ibm.com/developerworks/ru/library/l-python_part_3/index.html|archive-date=2013-02-15|url-status=live}}&amp;lt;/ref&amp;gt;) стеком можно назвать любой [[Список (информатика)|список]], так как для них доступны операции pop и push. В языке [[C++]] [[Стандартная библиотека языка C++|стандартная библиотека]] имеет класс с реализованной структурой и методами&amp;lt;ref&amp;gt;{{cite web|url=http://www.cplusplus.com/reference/stack/stack/|title=LIFO stack|access-date=2013-02-12|archive-url=https://www.webcitation.org/6ERYmbSlC?url=http://www.cplusplus.com/reference/stack/stack/|archive-date=2013-02-15|url-status=live}}&amp;lt;/ref&amp;gt; и т. д.&lt;br /&gt;
&lt;br /&gt;
== Программный стек ==&lt;br /&gt;
&lt;br /&gt;
=== {{Anchor|STACK-POINTER}}Организация в памяти ===&lt;br /&gt;
[[Файл:Lifo stack.svg|thumb|350px|right|Организация стека в виде одномерного упорядоченного по адресам массива. Показаны операции вталкивания и выталкивания данных из стека операциями &amp;#039;&amp;#039;push&amp;#039;&amp;#039; и &amp;#039;&amp;#039;pop&amp;#039;&amp;#039;]]&lt;br /&gt;
Зачастую стек реализуется в виде однонаправленного списка (каждый элемент в списке содержит помимо хранимой информации в стеке [[Указатель (тип данных)|указатель]] на следующий элемент стека).&lt;br /&gt;
&lt;br /&gt;
Но также часто стек располагается в [[Массив (программирование)|одномерном массиве]] с упорядоченными адресами. Такая организация стека удобна, если элемент информации занимает в памяти фиксированное количество слов, например, 1 слово. При этом отпадает необходимость хранения в элементе стека явного указателя на следующий элемент стека, что экономит память. При этом указатель стека (&amp;#039;&amp;#039;Stack Pointer&amp;#039;&amp;#039;, — &amp;#039;&amp;#039;&amp;#039;SP&amp;#039;&amp;#039;&amp;#039;) обычно является [[Регистр процессора|регистром процессора]] и указывает на адрес головы стека.&lt;br /&gt;
&lt;br /&gt;
Предположим для примера, что голова стека расположена по меньшему адресу, следующие элементы располагаются по нарастающим адресам. При каждом вталкивании слова в стек SP сначала увеличивается на 1 и затем по адресу из SP производится запись в память. При каждом извлечении слова из стека (выталкивании) сначала производится чтение по текущему адресу из SP и последующее уменьшение содержимого SP на 1.&lt;br /&gt;
&lt;br /&gt;
При организации стека в виде однонаправленного списка значением переменной стека является указатель на его вершину — адрес вершины. Если стек пуст, то значение указателя равно NULL.&lt;br /&gt;
&lt;br /&gt;
Пример реализации стека на языке Си:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;struct stack&lt;br /&gt;
{&lt;br /&gt;
    void *data;&lt;br /&gt;
    struct stack *next;&lt;br /&gt;
};&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Операции со стеком ===&lt;br /&gt;
Возможны три операции со стеком: добавление элемента (иначе проталкивание, {{lang-en2|push}}), удаление элемента ({{lang-en2|pop}}) и чтение головного элемента ({{lang-en2|peek}})&amp;lt;ref&amp;gt;{{cite web|url=http://www.rsdn.ru/article/alg/adt/adt.xml|title=Введение|access-date=2013-02-11|archive-url=https://www.webcitation.org/6ERYn3XNS?url=http://www.rsdn.ru/article/alg/adt/adt.xml|archive-date=2013-02-15|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При проталкивании ({{lang-en2|push}}) добавляется новый элемент, указывающий на элемент, бывший до этого головой. Новый элемент теперь становится головным.&lt;br /&gt;
&lt;br /&gt;
При удалении элемента ({{lang-en2|pop}}) убирается первый, а головным становится тот, на который был указатель у этого объекта (следующий элемент). При этом значение убранного элемента возвращается.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;stdexcept&amp;gt; // для std::overflow_error и std::underflow_error&lt;br /&gt;
&lt;br /&gt;
class ArrayStack {&lt;br /&gt;
private:&lt;br /&gt;
    static const int MAX_SIZE = 100; // Максимальный размер стека&lt;br /&gt;
    int stack[MAX_SIZE];&lt;br /&gt;
    int topIndex; // Индекс вершины стека&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    ArrayStack() : topIndex(-1) {} // Инициализация пустого стека&lt;br /&gt;
&lt;br /&gt;
    // Проверка на пустоту&lt;br /&gt;
    bool isEmpty() const {&lt;br /&gt;
        return topIndex == -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Проверка на переполнение&lt;br /&gt;
    bool isFull() const {&lt;br /&gt;
        return topIndex == MAX_SIZE - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Добавление элемента в стек&lt;br /&gt;
    void push(int value) {&lt;br /&gt;
        if (isFull()) {&lt;br /&gt;
            throw std::overflow_error(&amp;quot;Стек переполнен!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        stack[++topIndex] = value;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Удаление и возврат верхнего элемента&lt;br /&gt;
    int pop() {&lt;br /&gt;
        if (isEmpty()) {&lt;br /&gt;
            throw std::underflow_error(&amp;quot;Стек пуст!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return stack[topIndex--];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Просмотр верхнего элемента без удаления&lt;br /&gt;
    int peek() const {&lt;br /&gt;
        if (isEmpty()) {&lt;br /&gt;
            throw std::underflow_error(&amp;quot;Стек пуст!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return stack[topIndex];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Вывод стека&lt;br /&gt;
    void print() const {&lt;br /&gt;
        if (isEmpty()) {&lt;br /&gt;
            std::cout &amp;lt;&amp;lt; &amp;quot;Стек пуст!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Стек (сверху вниз): &amp;quot;;&lt;br /&gt;
        for (int i = topIndex; i &amp;gt;= 0; --i) {&lt;br /&gt;
            std::cout &amp;lt;&amp;lt; stack[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    ArrayStack stack;&lt;br /&gt;
&lt;br /&gt;
    stack.push(10);&lt;br /&gt;
    stack.push(20);&lt;br /&gt;
    stack.push(30);&lt;br /&gt;
&lt;br /&gt;
    stack.print(); // Вывод: 30 20 10&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Верхний элемент: &amp;quot; &amp;lt;&amp;lt; stack.peek() &amp;lt;&amp;lt; std::endl; // 30&lt;br /&gt;
&lt;br /&gt;
    stack.pop();&lt;br /&gt;
    stack.print(); // Вывод: 20 10&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Область применения ===&lt;br /&gt;
Программный вид стека используется для обхода [[Структура данных|структур данных]], например, [[Дерево (теория графов)|дерева]] или [[Граф (математика)|графа]]. При использовании [[Рекурсивные функции|рекурсивных функций]] также будет применяться стек, но его аппаратный вид. Кроме этих назначений, стек используется для организации [[Обратная польская запись|стековой машины]], реализующей вычисления в [[Обратная польская запись|обратной польской записи]]. Примером использования стековой машины является программа [[Unix]] [[dc]].&lt;br /&gt;
&lt;br /&gt;
Для отслеживания точек возврата из [[Подпрограмма|подпрограмм]] используется [[стек вызовов]].&lt;br /&gt;
&lt;br /&gt;
[[Математический сопроцессор|Арифметические сопроцессоры]], [[Программируемый калькулятор|программируемые микрокалькуляторы]] и язык [[Forth]] используют стековую модель вычислений&amp;lt;ref&amp;gt;{{cite web|url=http://savlm.ucoz.ru/publ/10-1-0-47|title=Стек|access-date=2013-02-12|archive-url=https://www.webcitation.org/6ERYq9IMI?url=http://savlm.ucoz.ru/publ/10-1-0-47|archive-date=2013-02-15|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея стека используется в стековой машине среди [[Стековый язык|стековых языков программирования]].&lt;br /&gt;
&lt;br /&gt;
== Аппаратный стек ==&lt;br /&gt;
Другое название аппаратного стека — машинный стек. Работа с ним поддерживается аппаратно центральным процессором. Машинный стек используется для нужд выполняющейся программы: хранения переменных и вызова [[Подпрограмма|подпрограмм]]. При вызове [[Подпрограмма|подпрограммы (процедуры)]] процессор помещает в стек адрес команды, следующей за командой вызова подпрограммы «адрес возврата» из подпрограммы. По команде возврата из подпрограммы из стека извлекается адрес возврата в вызвавшую подпрограмму программу и осуществляется переход по этому адресу.&lt;br /&gt;
&lt;br /&gt;
Аналогичные процессы происходят при [[Прерывание|аппаратном прерывании]] (процессор X86 при аппаратном прерывании сохраняет автоматически в стеке ещё и регистр флагов). Кроме того, [[компилятор]]ы размещают локальные переменные процедур в стеке (если в процессоре предусмотрен доступ к произвольному месту стека).&lt;br /&gt;
&lt;br /&gt;
В [[X86|архитектуре X86]] аппаратный стек — непрерывная область памяти, адресуемая специальными регистрами ESP (указатель стека) и SS (селектор сегмента стека)&amp;lt;ref name=ReferenceA&amp;gt;{{cite web|url=http://dvo.sut.ru/libr/cvti/i618buz/8.htm|title=8.1. Логическая структура памяти программы|access-date=2013-02-20|archive-url=https://web.archive.org/web/20121203072017/http://dvo.sut.ru/libr/cvti/i618buz/8.htm|archive-date=2012-12-03|url-status=dead}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
До использования стека он должен быть инициализирован так, чтобы регистры SS:ESP указывали на адрес головы стека в области физической оперативной памяти, причём под хранение данных в стеке необходимо зарезервировать нужное количество ячеек памяти (очевидно, что стек в [[Постоянное запоминающее устройство|ПЗУ]], естественно, не может быть организован). Прикладные программы, как правило, от операционной системы получают готовый к употреблению стек. В защищённом режиме работы процессора сегмент состояния задачи содержит четыре селектора сегментов стека (для разных уровней привилегий), но в каждый момент используется только один стек&amp;lt;ref&amp;gt;{{cite web|url=https://math.semestr.ru/inf/memory9.php|title=Стек|access-date=2013-02-12|archive-url=https://web.archive.org/web/20130101073647/http://math.semestr.ru/inf/memory9.php|archive-date=2013-01-01|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{wikibooks|Реализации алгоритмов/Стек|Стек}}&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
{{Структуры данных}}&lt;br /&gt;
{{Аспекты операционных систем}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Стек]]&lt;br /&gt;
[[Категория:Технологии процессоров]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Gromolyak</name></author>
	</entry>
</feed>