<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://apmath.info/w/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://apmath.info/w/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://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;action=history"/>
	<updated>2026-11-03T19:10:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=659&amp;oldid=prev</id>
		<title>СВ: /* Устройство */</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=659&amp;oldid=prev"/>
		<updated>2026-10-25T20:30:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Устройство&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 20:30, 25 октября 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l60&quot;&gt;Строка 60:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 60:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* '''Односвязный список.''' Вершина — первый узел &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; добавляет узел в начало, &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; сдвигает &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. Нет фиксированной ёмкости, но есть накладные расходы на узлы.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* '''Односвязный список.''' Вершина — первый узел &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; добавляет узел в начало, &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; сдвигает &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. Нет фиксированной ёмкости, но есть накладные расходы на узлы.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Обе реализации дают &lt;/del&gt;&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;на операцию&lt;/del&gt;. На практике чаще берут массив (кэш-дружелюбность) — так устроены &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; (по умолчанию поверх &amp;lt;code&amp;gt;std::deque&amp;lt;/code&amp;gt;) и &amp;lt;code&amp;gt;std::vector&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;В массиве &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; амортизированно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (худший случай — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при удвоении ёмкости), а &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;; в списке &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; — строго &lt;/ins&gt;&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. На практике чаще берут массив (кэш-дружелюбность) — так устроены &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; (по умолчанию поверх &amp;lt;code&amp;gt;std::deque&amp;lt;/code&amp;gt;) и &amp;lt;code&amp;gt;std::vector&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:stack-02-implementations.svg|frame|none|700px|Рис. 2. Массив с индексом вершины и односвязный список с вершиной в голове; обе реализации дают &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; на &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:stack-02-implementations.svg|frame|none|700px|Рис. 2. Массив с индексом вершины и односвязный список с вершиной в голове; обе реализации дают &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; на &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key apmath_info_db-w:diff::1.12:old-257:rev-659 --&gt;
&lt;/table&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=257&amp;oldid=prev</id>
		<title>СВ: /* Источники */</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=257&amp;oldid=prev"/>
		<updated>2026-09-30T19:05:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Источники&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 19:05, 30 сентября 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l433&quot;&gt;Строка 433:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 433:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Dijkstra E. W. Algol 60 Translation (алгоритм «сортировочной станции»). — 1961/1965.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Dijkstra E. W. Algol 60 Translation (алгоритм «сортировочной станции»). — 1961/1965.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Wikipedia: Stack (abstract data type). URL: https://en.wikipedia.org/wiki/Stack_(abstract_data_type).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Wikipedia: Stack (abstract data type). URL: https://en.wikipedia.org/wiki/Stack_(abstract_data_type).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Алгоритмы и структуры данных]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key apmath_info_db-w:diff::1.12:old-249:rev-257 --&gt;
&lt;/table&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=249&amp;oldid=prev</id>
		<title>СВ: /* Корректность и оценка сложности */</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=249&amp;oldid=prev"/>
		<updated>2026-09-29T21:09:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Корректность и оценка сложности&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 21:09, 29 сентября 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l332&quot;&gt;Строка 332:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 332:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Корректность и оценка сложности ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Корректность и оценка сложности ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/del&gt;Лемма &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1 (&lt;/del&gt;LIFO&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;).''' &lt;/del&gt;После любой последовательности операций &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; порядок элементов в стеке — это порядок их добавления, а &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; возвращает последний добавленный из оставшихся.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{&lt;/ins&gt;Лемма&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|about=&lt;/ins&gt;LIFO&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|statement=&lt;/ins&gt;После любой последовательности операций &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; порядок элементов в стеке — это порядок их добавления, а &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; возвращает последний добавленный из оставшихся.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|proof=Индукция по числу операций. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; добавляет элемент в конец (на вершину); &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; удаляет из конца. Последовательность хранится как стек-массив &amp;lt;code&amp;gt;a[0..top]&amp;lt;/code&amp;gt;; вершина — &amp;lt;code&amp;gt;a[top]&amp;lt;/code&amp;gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;''Доказательство.'' Индукция по числу операций. &lt;/del&gt;&amp;lt;code&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;push&lt;/del&gt;&amp;lt;/code&amp;gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;добавляет элемент в конец (на вершину); &lt;/del&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pop&lt;/del&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;удаляет из конца. Последовательность хранится как стек&lt;/del&gt;-&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;массив &lt;/del&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;a[0&lt;/del&gt;..&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;top&lt;/del&gt;]&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;; вершина &lt;/del&gt;— &amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;a[top]&lt;/del&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;. &amp;lt;math&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;\blacksquare&lt;/del&gt;&amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Лемма&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|about=корректность монотонного стека&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|statement=&lt;/ins&gt;&amp;lt;code&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Next-Greater&lt;/ins&gt;&amp;lt;/code&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; возвращает ближайший &amp;lt;math&amp;gt;j &amp;gt; i&amp;lt;/math&amp;gt; с &lt;/ins&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;math&amp;gt;A[j] &lt;/ins&gt;&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;A[i]&lt;/ins&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;math&amp;gt; либо &amp;lt;math&lt;/ins&gt;&amp;gt;-&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1&lt;/ins&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/math&lt;/ins&gt;&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|proof=В стеке поддерживаются индексы с убывающими значениями&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;При поступлении &amp;lt;math&amp;gt;A[i&lt;/ins&gt;]&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;math&lt;/ins&gt;&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;снимаются все меньшие вершины &lt;/ins&gt;— &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;для них &lt;/ins&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;math&lt;/ins&gt;&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;i&lt;/ins&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;math&lt;/ins&gt;&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;и есть ближайший больший справа (все промежуточные уже сняты ранее и не могли быть большими)&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Оставшиеся больше &lt;/ins&gt;&amp;lt;math&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;A[i]&lt;/ins&gt;&amp;lt;/math&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;и ждут своего большего.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''Лемма 2 (корректность монотонного стека).''' &amp;lt;code&amp;gt;Next-Greater&amp;lt;/code&amp;gt; для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; возвращает ближайший &amp;lt;math&amp;gt;j &amp;gt; i&amp;lt;/math&amp;gt; с &amp;lt;math&amp;gt;A[j] &amp;gt; A[i]&amp;lt;/math&amp;gt; либо &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Теорема&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|about=&lt;/ins&gt;амортизированная стоимость&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;''Доказательство.'' В стеке поддерживаются индексы с убывающими значениями. При поступлении &amp;lt;math&amp;gt;A[i]&amp;lt;/math&amp;gt; снимаются все меньшие вершины — для них &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и есть ближайший больший справа (все промежуточные уже сняты ранее и не могли быть большими). Оставшиеся больше &amp;lt;math&amp;gt;A[i]&amp;lt;/math&amp;gt; и ждут своего большего. &amp;lt;math&amp;gt;\blacksquare&amp;lt;/math&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|statement=&lt;/ins&gt;Последовательность из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; в стек с удвоением ёмкости стоит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; суммарно.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|proof=&lt;/ins&gt;Копирование при удвоении стоит &amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt;(размер). Сумма по всем удвоениям геометрическая: &amp;lt;math&amp;gt;1 + 2 + 4 + \dots + n/2 &amp;lt; n&amp;lt;/math&amp;gt;. Значит, суммарно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; амортизированно на &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;'''Теорема 3 (&lt;/del&gt;амортизированная стоимость&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;).''' &lt;/del&gt;Последовательность из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; в стек с удвоением ёмкости стоит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; суммарно.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;''Доказательство.'' &lt;/del&gt;Копирование при удвоении стоит &amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt;(размер). Сумма по всем удвоениям геометрическая: &amp;lt;math&amp;gt;1 + 2 + 4 + \dots + n/2 &amp;lt; n&amp;lt;/math&amp;gt;. Значит, суммарно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; амортизированно на &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;math&amp;gt;\blacksquare&amp;lt;/math&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''Оценка.''' &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (в массиве амортизированно); память &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;; &amp;lt;code&amp;gt;balanced&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;nextGreater&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; времени.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''Оценка.''' &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (в массиве амортизированно); память &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;; &amp;lt;code&amp;gt;balanced&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;nextGreater&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; времени.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key apmath_info_db-w:diff::1.12:old-248:rev-249 --&gt;
&lt;/table&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=248&amp;oldid=prev</id>
		<title>СВ: /* Пример: стек вызовов и рекурсия */</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=248&amp;oldid=prev"/>
		<updated>2026-09-29T21:06:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Пример: стек вызовов и рекурсия&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 21:06, 29 сентября 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l128&quot;&gt;Строка 128:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 128:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''Разбор.''' &amp;lt;code&amp;gt;fact(3)&amp;lt;/code&amp;gt;: кадры &amp;lt;code&amp;gt;main → fact(3) → fact(2) → fact(1)&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;fact(1)&amp;lt;/code&amp;gt; возвращает 1, затем кадры снимаются в обратном порядке (рис. 3).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''Разбор.''' &amp;lt;code&amp;gt;fact(3)&amp;lt;/code&amp;gt;: кадры &amp;lt;code&amp;gt;main → fact(3) → fact(2) → fact(1)&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;fact(1)&amp;lt;/code&amp;gt; возвращает 1, затем кадры снимаются в обратном порядке (рис. 3).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:stack-03-callstack.svg|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;thumb&lt;/del&gt;|700px|Рис. 3. Кадры рекурсии &amp;lt;code&amp;gt;fact(3)&amp;lt;/code&amp;gt;: при вызовах стек растёт, при возвратах — снимается в обратном порядке.]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Файл:stack-03-callstack.svg|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;frame|none&lt;/ins&gt;|700px|Рис. 3. Кадры рекурсии &amp;lt;code&amp;gt;fact(3)&amp;lt;/code&amp;gt;: при вызовах стек растёт, при возвратах — снимается в обратном порядке.]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Пример: монотонный стек (следующий больший элемент) ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Пример: монотонный стек (следующий больший элемент) ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key apmath_info_db-w:diff::1.12:old-247:rev-248 --&gt;
&lt;/table&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=247&amp;oldid=prev</id>
		<title>СВ: Новая страница: «== TL;DR ==  Стек (stack) — простейшая структура данных с доступом по принципу '''LIFO''' (last in, first out):...»</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA&amp;diff=247&amp;oldid=prev"/>
		<updated>2026-09-29T21:05:44Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== TL;DR ==  Стек (stack) — простейшая структура данных с доступом по принципу &amp;#039;&amp;#039;&amp;#039;LIFO&amp;#039;&amp;#039;&amp;#039; (last in, first out):...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== TL;DR ==&lt;br /&gt;
&lt;br /&gt;
Стек (stack) — простейшая структура данных с доступом по принципу '''LIFO''' (last in, first out): элементы добавляются и удаляются только с одного конца — '''вершины'''. Операции &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; (положить наверх), &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; (снять верхний), &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;peek&amp;lt;/code&amp;gt; (посмотреть верхний) и &amp;lt;code&amp;gt;empty&amp;lt;/code&amp;gt; выполняются за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Реализуется динамическим массивом или односвязным списком; в массивном варианте &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; амортизированно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; благодаря удвоению ёмкости. Стек лежит в основе '''стека вызовов''' (рекурсия), вычисления выражений, проверки скобок, обхода в глубину, отмены действий и '''монотонного стека''' (следующий больший элемент за &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;). Ограничение — доступ только к вершине: к середине стека обратиться нельзя.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Свойство !! Значение&lt;br /&gt;
|-&lt;br /&gt;
| Класс || Линейная структура данных; абстрактный тип «последним пришёл — первым вышел»&lt;br /&gt;
|-&lt;br /&gt;
| Порядок доступа || LIFO (last in, first out)&lt;br /&gt;
|-&lt;br /&gt;
| Операции || &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;peek&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;empty&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Сложность || все операции &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (в массиве — амортизированно)&lt;br /&gt;
|-&lt;br /&gt;
| Память || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Реализации || динамический массив (&amp;lt;code&amp;gt;std::vector&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt;), односвязный список&lt;br /&gt;
|-&lt;br /&gt;
| Доступ || только к вершине (нет произвольного доступа)&lt;br /&gt;
|-&lt;br /&gt;
| Родственники || [[Очередь с приоритетом|очередь]] (FIFO), двусторонняя очередь (deque), дек с ограничением&lt;br /&gt;
|-&lt;br /&gt;
| Где встречается || стек вызовов, парсеры, вычисление выражений, DFS, отмена действий, монотонные задачи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Определения ==&lt;br /&gt;
&lt;br /&gt;
'''Стек''' — коллекция элементов, в которой добавление и удаление происходят с одного конца, называемого '''вершиной''' (top). Элемент, добавленный последним, удаляется первым (LIFO).&lt;br /&gt;
&lt;br /&gt;
'''Операции:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;push(x)&amp;lt;/code&amp;gt; — положить &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; на вершину;&lt;br /&gt;
* &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt; — снять и вернуть верхний элемент;&lt;br /&gt;
* &amp;lt;code&amp;gt;top()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;peek()&amp;lt;/code&amp;gt; — посмотреть верхний элемент, не снимая;&lt;br /&gt;
* &amp;lt;code&amp;gt;empty()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;size()&amp;lt;/code&amp;gt; — пуст ли стек и сколько в нём элементов.&lt;br /&gt;
&lt;br /&gt;
'''Инвариант.''' Элементы хранятся в порядке добавления; снимается всегда последний добавленный. Стек либо пуст, либо имеет ровно одну вершину.&lt;br /&gt;
&lt;br /&gt;
'''Переполнение/недостача.''' &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; на пустом стеке — '''недостача''' (underflow, ошибка). Переполнение (overflow) возможно при фиксированной ёмкости; в динамическом массиве его нет, но возможен исчерпание памяти или переполнение стека вызовов.&lt;br /&gt;
&lt;br /&gt;
'''Обозначения.''' &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — число элементов; &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; — индекс/указатель вершины; амортизированные оценки — по последовательности операций.&lt;br /&gt;
&lt;br /&gt;
[[Файл:stack-01-adt.svg|thumb|700px|Рис. 1. Операции стека выполняются только над вершиной; последний добавленный элемент снимается первым.]]&lt;br /&gt;
&lt;br /&gt;
== Мотивация и интуиция ==&lt;br /&gt;
&lt;br /&gt;
Многие процессы '''вложены''': функция вызывает функцию, скобка открывается внутри скобки, HTML-тег внутри тега, действие отменяется последним первым. Все они имеют «обратный» порядок разрешения: то, что открылось позже, закрывается раньше. Именно этот порядок LIFO и моделирует стек.&lt;br /&gt;
&lt;br /&gt;
Достаточно хранить элементы «стопкой»: новый кладётся сверху, снимается тоже сверху. Никакого поиска, перестановок или индексации — все операции тривиальны и стоят &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Простота стека обманчива: из него вырастают стек вызовов (на котором основана вся рекурсия), алгоритмы разбора и обхода, а его вариация — '''монотонный стек''' — решает целый класс задач за линейное время.&lt;br /&gt;
&lt;br /&gt;
Интуитивная картинка: стопка тарелок — можно взять только верхнюю; чтобы достать нижнюю, надо снять верхние.&lt;br /&gt;
&lt;br /&gt;
== Устройство ==&lt;br /&gt;
&lt;br /&gt;
Два классических представления:&lt;br /&gt;
&lt;br /&gt;
* '''Динамический массив.''' Элементы лежат подряд, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; — индекс последнего занятого. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; пишет в &amp;lt;code&amp;gt;a[++top]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; уменьшает &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;. При заполнении ёмкость удваивается (амортизированно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;).&lt;br /&gt;
* '''Односвязный список.''' Вершина — первый узел &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; добавляет узел в начало, &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; сдвигает &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. Нет фиксированной ёмкости, но есть накладные расходы на узлы.&lt;br /&gt;
&lt;br /&gt;
Обе реализации дают &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; на операцию. На практике чаще берут массив (кэш-дружелюбность) — так устроены &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; (по умолчанию поверх &amp;lt;code&amp;gt;std::deque&amp;lt;/code&amp;gt;) и &amp;lt;code&amp;gt;std::vector&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:stack-02-implementations.svg|frame|none|700px|Рис. 2. Массив с индексом вершины и односвязный список с вершиной в голове; обе реализации дают &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; на &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Операции и алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
=== Операция: push / pop / top ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Работать только с вершиной.&lt;br /&gt;
&lt;br /&gt;
'''Пошаговое описание (массив).'''&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;push(x)&amp;lt;/code&amp;gt;: увеличить &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;, записать &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;a[top]&amp;lt;/code&amp;gt; (при необходимости расширить массив).&lt;br /&gt;
# &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;: запомнить &amp;lt;code&amp;gt;a[top]&amp;lt;/code&amp;gt;, уменьшить &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;top()&amp;lt;/code&amp;gt;: вернуть &amp;lt;code&amp;gt;a[top]&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;empty()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;top &amp;amp;lt; 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Инвариант.''' Элементы &amp;lt;code&amp;gt;a[0..top]&amp;lt;/code&amp;gt; — содержимое стека, &amp;lt;code&amp;gt;a[top]&amp;lt;/code&amp;gt; — вершина.&lt;br /&gt;
&lt;br /&gt;
'''Псевдокод.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Push(S, x)&lt;br /&gt;
1  top[S] ← top[S] + 1&lt;br /&gt;
2  a[top[S]] ← x&lt;br /&gt;
&lt;br /&gt;
Алгоритм Pop(S)&lt;br /&gt;
3  if top[S] &amp;lt; 0&lt;br /&gt;
4      error &amp;quot;недостача: стек пуст&amp;quot;&lt;br /&gt;
5  x ← a[top[S]]&lt;br /&gt;
6  top[S] ← top[S] − 1&lt;br /&gt;
7  return x&lt;br /&gt;
&lt;br /&gt;
Алгоритм Top(S)&lt;br /&gt;
8  if top[S] &amp;lt; 0&lt;br /&gt;
9      error &amp;quot;недостача: стек пуст&amp;quot;&lt;br /&gt;
10 return a[top[S]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сложность:''' O(1) на операцию (в массиве — амортизированно). Память O(n).&lt;br /&gt;
&lt;br /&gt;
'''Корректность:''' операции затрагивают только вершину, порядок элементов сохраняется.&lt;br /&gt;
&lt;br /&gt;
'''Крайние случаи.''' &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; на пустом стеке — ошибка. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; при заполненной ёмкости — расширение.&lt;br /&gt;
&lt;br /&gt;
=== Операция: динамический рост (амортизация) ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' При заполнении массива удвоить ёмкость и скопировать элементы; &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; обычно не сжимает (или сжимает при сильном опустошении).&lt;br /&gt;
&lt;br /&gt;
'''Инвариант.''' &amp;lt;code&amp;gt;size ≤ capacity&amp;lt;/code&amp;gt;; при удвоении копия сохраняет порядок.&lt;br /&gt;
&lt;br /&gt;
'''Псевдокод.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Push-Growable(S, x)&lt;br /&gt;
1  if size[S] = capacity[S]&lt;br /&gt;
2      capacity[S] ← 2 · capacity[S]&lt;br /&gt;
3      скопировать a в массив новой ёмкости&lt;br /&gt;
4  a[size[S]] ← x;  size[S] ← size[S] + 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сложность:''' худший случай одного push — O(n), но n операций суммарно O(n), то есть амортизированно O(1).&lt;br /&gt;
&lt;br /&gt;
=== Пример: стек вызовов и рекурсия ===&lt;br /&gt;
&lt;br /&gt;
Любая рекурсия использует '''стек вызовов''': каждый вызов создаёт кадр (аргументы, локальные, адрес возврата). Кадры накапливаются вниз по рекурсии и снимаются на возвратах. Глубина рекурсии равна числу кадров; рекурсия без базы переполняет стек. Любую рекурсию можно переписать явным стеком.&lt;br /&gt;
&lt;br /&gt;
'''Разбор.''' &amp;lt;code&amp;gt;fact(3)&amp;lt;/code&amp;gt;: кадры &amp;lt;code&amp;gt;main → fact(3) → fact(2) → fact(1)&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;fact(1)&amp;lt;/code&amp;gt; возвращает 1, затем кадры снимаются в обратном порядке (рис. 3).&lt;br /&gt;
&lt;br /&gt;
[[Файл:stack-03-callstack.svg|thumb|700px|Рис. 3. Кадры рекурсии &amp;lt;code&amp;gt;fact(3)&amp;lt;/code&amp;gt;: при вызовах стек растёт, при возвратах — снимается в обратном порядке.]]&lt;br /&gt;
&lt;br /&gt;
=== Пример: монотонный стек (следующий больший элемент) ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Хранить в стеке индексы с '''убывающими''' значениями. Пока новый элемент больше вершины, вершина снимается — для неё найден следующий больший. Каждый индекс входит и снимается один раз → &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Next-Greater(A[1..n])&lt;br /&gt;
1  создать стек индексов S;  res[1..n] ← −1&lt;br /&gt;
2  for i ← 1 to n&lt;br /&gt;
3      while S не пуст и A[top[S]] &amp;lt; A[i]&lt;br /&gt;
4          res[top[S]] ← A[i]&lt;br /&gt;
5          Pop(S)&lt;br /&gt;
6      Push(S, i)&lt;br /&gt;
7  return res&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Сложность:''' O(n) — каждый индекс кладётся и снимается по разу.&lt;br /&gt;
&lt;br /&gt;
[[Файл:stack-04-monotonic.svg|frame|none|700px|Рис. 4. Следующий больший элемент для &amp;lt;math&amp;gt;[2,1,5,3,4]&amp;lt;/math&amp;gt; через убывающий монотонный стек.]]&lt;br /&gt;
&lt;br /&gt;
=== Реализация на C++ ===&lt;br /&gt;
&lt;br /&gt;
Две реализации стека (массив и список), плюс два классических применения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
#include &amp;lt;stdexcept&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Стек на динамическом массиве&lt;br /&gt;
template &amp;lt;typename T&amp;gt;&lt;br /&gt;
class ArrayStack {&lt;br /&gt;
    std::vector&amp;lt;T&amp;gt; a_;&lt;br /&gt;
public:&lt;br /&gt;
    void push(const T&amp;amp; x) { a_.push_back(x); }&lt;br /&gt;
    void pop() {&lt;br /&gt;
        if (a_.empty()) throw std::underflow_error(&amp;quot;pop on empty stack&amp;quot;);&lt;br /&gt;
        a_.pop_back();&lt;br /&gt;
    }&lt;br /&gt;
    const T&amp;amp; top() const {&lt;br /&gt;
        if (a_.empty()) throw std::underflow_error(&amp;quot;top on empty stack&amp;quot;);&lt;br /&gt;
        return a_.back();&lt;br /&gt;
    }&lt;br /&gt;
    bool empty() const { return a_.empty(); }&lt;br /&gt;
    std::size_t size() const { return a_.size(); }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Стек на односвязном списке&lt;br /&gt;
template &amp;lt;typename T&amp;gt;&lt;br /&gt;
class LinkedStack {&lt;br /&gt;
    struct Node { T val; Node* next; };&lt;br /&gt;
    Node* head_ = nullptr;&lt;br /&gt;
    std::size_t n_ = 0;&lt;br /&gt;
public:&lt;br /&gt;
    LinkedStack() = default;&lt;br /&gt;
    ~LinkedStack() { while (head_) { Node* t = head_; head_ = head_-&amp;gt;next; delete t; } }&lt;br /&gt;
    LinkedStack(const LinkedStack&amp;amp;) = delete;&lt;br /&gt;
    LinkedStack&amp;amp; operator=(const LinkedStack&amp;amp;) = delete;&lt;br /&gt;
&lt;br /&gt;
    void push(const T&amp;amp; x) { head_ = new Node{x, head_}; ++n_; }&lt;br /&gt;
    void pop() {&lt;br /&gt;
        if (!head_) throw std::underflow_error(&amp;quot;pop on empty stack&amp;quot;);&lt;br /&gt;
        Node* t = head_;&lt;br /&gt;
        head_ = head_-&amp;gt;next;&lt;br /&gt;
        delete t;&lt;br /&gt;
        --n_;&lt;br /&gt;
    }&lt;br /&gt;
    const T&amp;amp; top() const {&lt;br /&gt;
        if (!head_) throw std::underflow_error(&amp;quot;top on empty stack&amp;quot;);&lt;br /&gt;
        return head_-&amp;gt;val;&lt;br /&gt;
    }&lt;br /&gt;
    bool empty() const { return head_ == nullptr; }&lt;br /&gt;
    std::size_t size() const { return n_; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Проверка сбалансированности скобок&lt;br /&gt;
bool balanced(const std::string&amp;amp; s) {&lt;br /&gt;
    ArrayStack&amp;lt;char&amp;gt; st;&lt;br /&gt;
    for (char c : s) {&lt;br /&gt;
        if (c == '(' || c == '[' || c == '{') {&lt;br /&gt;
            st.push(c);&lt;br /&gt;
        } else if (c == ')' || c == ']' || c == '}') {&lt;br /&gt;
            if (st.empty()) return false;&lt;br /&gt;
            char o = st.top();&lt;br /&gt;
            st.pop();&lt;br /&gt;
            if ((c == ')' &amp;amp;&amp;amp; o != '(') ||&lt;br /&gt;
                (c == ']' &amp;amp;&amp;amp; o != '[') ||&lt;br /&gt;
                (c == '}' &amp;amp;&amp;amp; o != '{')) return false;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return st.empty();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Следующий больший элемент (монотонный стек)&lt;br /&gt;
std::vector&amp;lt;int&amp;gt; nextGreater(const std::vector&amp;lt;int&amp;gt;&amp;amp; a) {&lt;br /&gt;
    int n = static_cast&amp;lt;int&amp;gt;(a.size());&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; res(n, -1);&lt;br /&gt;
    ArrayStack&amp;lt;int&amp;gt; st;                 // хранит индексы&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
        while (!st.empty() &amp;amp;&amp;amp; a[st.top()] &amp;lt; a[i]) {&lt;br /&gt;
            res[st.top()] = a[i];&lt;br /&gt;
            st.pop();&lt;br /&gt;
        }&lt;br /&gt;
        st.push(i);&lt;br /&gt;
    }&lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // 1) базовые операции над массивом&lt;br /&gt;
    ArrayStack&amp;lt;int&amp;gt; s;&lt;br /&gt;
    for (int x : {1, 2, 3}) s.push(x);&lt;br /&gt;
    assert(s.top() == 3 &amp;amp;&amp;amp; s.size() == 3);&lt;br /&gt;
    s.pop();&lt;br /&gt;
    assert(s.top() == 2);&lt;br /&gt;
&lt;br /&gt;
    // 2) LIFO-порядок на списке&lt;br /&gt;
    LinkedStack&amp;lt;int&amp;gt; l;&lt;br /&gt;
    for (int x : {1, 2, 3, 4}) l.push(x);&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; out;&lt;br /&gt;
    while (!l.empty()) { out.push_back(l.top()); l.pop(); }&lt;br /&gt;
    assert((out == std::vector&amp;lt;int&amp;gt;{4, 3, 2, 1}));&lt;br /&gt;
&lt;br /&gt;
    // 3) скобки&lt;br /&gt;
    assert(balanced(&amp;quot;([]{})&amp;quot;));&lt;br /&gt;
    assert(!balanced(&amp;quot;([)]&amp;quot;));&lt;br /&gt;
    assert(!balanced(&amp;quot;(&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    // 4) следующий больший&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; a = {2, 1, 5, 3, 4};&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; g = nextGreater(a);&lt;br /&gt;
    assert((g == std::vector&amp;lt;int&amp;gt;{5, 5, -1, 4, -1}));&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;ok\n&amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Замечания по реализации.'''&lt;br /&gt;
&lt;br /&gt;
* В стандартной библиотеке C++ стек — &amp;lt;code&amp;gt;std::stack&amp;amp;lt;T, Container&amp;amp;gt;&amp;lt;/code&amp;gt;; по умолчанию контейнер &amp;lt;code&amp;gt;std::deque&amp;lt;/code&amp;gt;, можно взять &amp;lt;code&amp;gt;std::vector&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; предоставляет только &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;empty&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; — без обхода.&lt;br /&gt;
* Реализация на массиве кэш-дружелюбнее; список обходится без перевыделения.&lt;br /&gt;
* Не забывайте про недостачу: &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; на пустом стеке — ошибка (в &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; — UB, проверяйте &amp;lt;code&amp;gt;empty()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Сводная таблица сложности ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Операция !! Худший !! Амортизированная !! Память !! Примечание&lt;br /&gt;
|-&lt;br /&gt;
| Push || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (массив: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при расширении) || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || список — строго &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Pop || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| Top / Peek || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || просмотр вершины&lt;br /&gt;
|-&lt;br /&gt;
| Empty / Size || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| Поиск элемента || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || не свойственная стеку операция&lt;br /&gt;
|-&lt;br /&gt;
| Память структуры || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || + запас ёмкости в массиве&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Примечание.''' Отдельный &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; в динамическом массиве может стоить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; (копирование при удвоении), но серия из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; добавлений — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; суммарно, значит '''амортизированно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;''' на операцию (тот же аргумент «геометрического роста», что у динамического массива). Списочный стек даёт строгое &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, но платит аллокацией узлов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:stack-05-complexity.svg|frame|none|700px|Рис. 5. Все операции — &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;; в массиве &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; амортизированно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; из-за удвоения ёмкости.]]&lt;br /&gt;
&lt;br /&gt;
== Трассировка примера ==&lt;br /&gt;
&lt;br /&gt;
Операции над стеком (слева — вершина). Покажем содержимое после каждой команды.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Шаг !! Операция !! Стек (вершина слева) !! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 1 || push(10) || [10] || —&lt;br /&gt;
|-&lt;br /&gt;
| 2 || push(20) || [20, 10] || —&lt;br /&gt;
|-&lt;br /&gt;
| 3 || push(30) || [30, 20, 10] || —&lt;br /&gt;
|-&lt;br /&gt;
| 4 || top() || [30, 20, 10] || 30&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pop() || [20, 10] || 30&lt;br /&gt;
|-&lt;br /&gt;
| 6 || pop() || [10] || 20&lt;br /&gt;
|-&lt;br /&gt;
| 7 || push(40) || [40, 10] || —&lt;br /&gt;
|-&lt;br /&gt;
| 8 || pop() || [10] || 40&lt;br /&gt;
|-&lt;br /&gt;
| 9 || empty() || [10] || false&lt;br /&gt;
|-&lt;br /&gt;
| 10 || pop() || [] || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Порядок извлечения &amp;lt;code&amp;gt;30, 20, 40, 10&amp;lt;/code&amp;gt; — «обратный» порядку добавления (с учётом промежуточной вставки 40): это и есть LIFO.&lt;br /&gt;
&lt;br /&gt;
== Корректность и оценка сложности ==&lt;br /&gt;
&lt;br /&gt;
'''Лемма 1 (LIFO).''' После любой последовательности операций &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; порядок элементов в стеке — это порядок их добавления, а &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; возвращает последний добавленный из оставшихся.&lt;br /&gt;
&lt;br /&gt;
''Доказательство.'' Индукция по числу операций. &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; добавляет элемент в конец (на вершину); &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; удаляет из конца. Последовательность хранится как стек-массив &amp;lt;code&amp;gt;a[0..top]&amp;lt;/code&amp;gt;; вершина — &amp;lt;code&amp;gt;a[top]&amp;lt;/code&amp;gt;. &amp;lt;math&amp;gt;\blacksquare&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Лемма 2 (корректность монотонного стека).''' &amp;lt;code&amp;gt;Next-Greater&amp;lt;/code&amp;gt; для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; возвращает ближайший &amp;lt;math&amp;gt;j &amp;gt; i&amp;lt;/math&amp;gt; с &amp;lt;math&amp;gt;A[j] &amp;gt; A[i]&amp;lt;/math&amp;gt; либо &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Доказательство.'' В стеке поддерживаются индексы с убывающими значениями. При поступлении &amp;lt;math&amp;gt;A[i]&amp;lt;/math&amp;gt; снимаются все меньшие вершины — для них &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и есть ближайший больший справа (все промежуточные уже сняты ранее и не могли быть большими). Оставшиеся больше &amp;lt;math&amp;gt;A[i]&amp;lt;/math&amp;gt; и ждут своего большего. &amp;lt;math&amp;gt;\blacksquare&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Теорема 3 (амортизированная стоимость).''' Последовательность из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; в стек с удвоением ёмкости стоит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; суммарно.&lt;br /&gt;
&lt;br /&gt;
''Доказательство.'' Копирование при удвоении стоит &amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt;(размер). Сумма по всем удвоениям геометрическая: &amp;lt;math&amp;gt;1 + 2 + 4 + \dots + n/2 &amp;lt; n&amp;lt;/math&amp;gt;. Значит, суммарно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; амортизированно на &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;. &amp;lt;math&amp;gt;\blacksquare&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Оценка.''' &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (в массиве амортизированно); память &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;; &amp;lt;code&amp;gt;balanced&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;nextGreater&amp;lt;/code&amp;gt; — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
== Сравнение с альтернативами ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Структура !! Порядок доступа !! push !! pop !! Произвольный доступ&lt;br /&gt;
|-&lt;br /&gt;
| '''Стек''' || LIFO || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || нет&lt;br /&gt;
|-&lt;br /&gt;
| Очередь (queue) || FIFO || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || нет&lt;br /&gt;
|-&lt;br /&gt;
| Двусторонняя очередь (deque) || оба конца || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || нет&lt;br /&gt;
|-&lt;br /&gt;
| [[Очередь с приоритетом|Очередь с приоритетом]] || по приоритету || &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; || нет&lt;br /&gt;
|-&lt;br /&gt;
| Динамический массив || по индексу || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; аморт. || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; с конца || да, &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Связный список || по позиции || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; в начало || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; из начала || нет, &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Вердикт.''' Стек выбирают, когда важен '''вложенный''' порядок разрешения: вызовы, скобки, отмена, обход в глубину, монотонные задачи. Если нужен порядок «пришёл первым — ушёл первым» — берут очередь; если нужен произвольный доступ — массив.&lt;br /&gt;
&lt;br /&gt;
== Где применяется ==&lt;br /&gt;
&lt;br /&gt;
# '''Стек вызовов и рекурсия.''' Любой вызов функции кладёт кадр на стек; хвостовая рекурсия и явный стек заменяют глубокую рекурсию.&lt;br /&gt;
# '''Вычисление выражений.''' Постфиксные (RPN) выражения вычисляются стеком; инфиксные переводятся в постфиксные (алгоритм сортировочной станции Дейкстры).&lt;br /&gt;
# '''Синтаксический анализ.''' Проверка скобок, разбор вложенных тегов/блоков, парсеры с рекурсивным спуском.&lt;br /&gt;
# '''Обход в глубину (DFS).''' Итеративный DFS хранит вершины в стеке; рекурсивный использует стек вызовов.&lt;br /&gt;
# '''Монотонный стек.''' Следующий больший/меньший элемент, гистограммы, «сколько дней до тепла» — за &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# '''Отмена действий (undo/redo) и «назад».''' Два стека для отмены и повтора; история в браузере.&lt;br /&gt;
# '''Oбработка отката и backtracking.''' Возврат по лабиринту, перебор с возвратом, рекурсивные алгоритмы с откатом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:stack-06-applications.svg|frame|none|700px|Рис. 6. Баланс скобок, вычисление постфиксных выражений, обход в глубину, отмена действий.]]&lt;br /&gt;
&lt;br /&gt;
== Историческая справка ==&lt;br /&gt;
&lt;br /&gt;
* '''1946–1950-е.''' Идея стека возникла вместе с архитектурой вычислительных машин; Тьюринг и фон Нейман использовали стекоподобную организацию для возврата из подпрограмм ⚠️ точные детали.&lt;br /&gt;
* '''1957.''' Ф. Бауэр и К. Замельсон ввели термин «стек» (нем. ''Keller'') и структуры ввода-вывода стека; позже термин закрепился в программировании ⚠️.&lt;br /&gt;
* '''1960-е.''' Стеки стали основой стековых машин и языков (Forth, PostScript) и вычислителей выражений.&lt;br /&gt;
* '''1965.''' Э. Дейкстра описал алгоритм «сортировочной станции» для перевода выражений со стеком.&lt;br /&gt;
* Стек вызовов — неотъемлемая часть большинства архитектур и языков с процедурами.&lt;br /&gt;
&lt;br /&gt;
== Типичные ошибки и подводные камни ==&lt;br /&gt;
&lt;br /&gt;
* '''Недостача (underflow).''' &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; на пустом стеке — ошибка (в &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; — UB); проверяйте &amp;lt;code&amp;gt;empty()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Переполнение стека вызовов.''' Глубокая рекурсия без базы или с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; глубиной переполняет стек; используйте явный стек или хвостовую рекурсию.&lt;br /&gt;
* '''Фиксированная ёмкость.''' Массивный стек без расширения переполняется; используйте динамический.&lt;br /&gt;
* '''Путаница LIFO/FIFO.''' Стек — «последним пришёл», очередь — «первым пришёл»; не путайте.&lt;br /&gt;
* '''Доступ к середине.''' У стека его нет; если нужен — возьмите массив/список.&lt;br /&gt;
* '''Итерация по &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt;.''' Нельзя без извлечения; &amp;lt;code&amp;gt;std::stack&amp;lt;/code&amp;gt; не даёт итераторов.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;std::stack::pop()&amp;lt;/code&amp;gt; не возвращает значение.''' Сначала &amp;lt;code&amp;gt;top()&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;pop()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Забыть про сжатие ёмкости.''' Долго живущий стек после массовых &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt; может держать большой буфер.&lt;br /&gt;
* '''Изменение ёмкости и инвалидация.''' При росте массива ссылки/указатели на элементы становятся недействительными.&lt;br /&gt;
* '''Рекурсия и явный стек.''' Переписывая рекурсию на стек, легко потерять порядок обхода (перепутать push соседей).&lt;br /&gt;
&lt;br /&gt;
== Задачи для практики ==&lt;br /&gt;
&lt;br /&gt;
# '''Реализация.''' Реализуйте стек массивом и списком; проверьте LIFO и амортизацию. Подсказка: удвоение ёмкости.&lt;br /&gt;
# '''Баланс скобок.''' Проверьте строку со скобками &amp;lt;code&amp;gt;()[]{}&amp;lt;/code&amp;gt;. Подсказка: стек открытых скобок.&lt;br /&gt;
# '''Постфиксное выражение.''' Вычислите RPN-выражение стеком. Подсказка: число — push, операция — два pop.&lt;br /&gt;
# '''Инфикс → постфикс.''' Реализуйте сортировочную станцию. Подсказка: стек операций и приоритеты.&lt;br /&gt;
# '''Минимум в стеке.''' Реализуйте &amp;lt;code&amp;gt;min()&amp;lt;/code&amp;gt; за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (дополнительный стек минимумов). Подсказка: два стека.&lt;br /&gt;
# '''Следующий больший.''' Решите монотонным стеком за &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Подсказка: убывающий стек индексов.&lt;br /&gt;
# '''Очередь двумя стеками.''' Реализуйте FIFO-очередь на двух стеках. Подсказка: входной и выходной.&lt;br /&gt;
# '''Итеративный DFS.''' Обойдите граф в глубину явным стеком. Подсказка: порядок push соседей обратен порядку обхода.&lt;br /&gt;
&lt;br /&gt;
== Связанные темы ==&lt;br /&gt;
&lt;br /&gt;
* [[Очередь]] — противоположный порядок FIFO; стек и очередь — два крайних случая deque.&lt;br /&gt;
* [[Персистентный стек]] — стек, сохраняющий все версии за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; на операцию.&lt;br /&gt;
* [[Очередь с приоритетом]] — структура с другим порядком извлечения.&lt;br /&gt;
* [[Графы]] (план) — обход в глубину на стеке.&lt;br /&gt;
* [[Двоичная куча]] — другой пример линейного/древовидного контейнера.&lt;br /&gt;
* [[Асимптотическая сложность]] — нотация &amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt; и амортизация.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
&lt;br /&gt;
# Cormen T. H., Leiserson C. E., Rivest R. L., Stein C. ''Introduction to Algorithms'' (CLRS). 3rd ed. — MIT Press, 2009. — Гл. 10 «Elementary Data Structures» (стек, очередь, связные списки).&lt;br /&gt;
# Knuth D. E. ''The Art of Computer Programming''. Vol. 1: Fundamental Algorithms. — Addison-Wesley, 3rd ed., 1997. — §2.2.1 «Stacks, Queues, and Deques».&lt;br /&gt;
# Sedgewick R., Wayne K. ''Algorithms''. 4th ed. — Addison-Wesley, 2011. — Гл. 1.3 (стек, очередь, вычисление выражений).&lt;br /&gt;
# Dijkstra E. W. Algol 60 Translation (алгоритм «сортировочной станции»). — 1961/1965.&lt;br /&gt;
# Wikipedia: Stack (abstract data type). URL: https://en.wikipedia.org/wiki/Stack_(abstract_data_type).&lt;/div&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
</feed>