<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3812438</guid>
        <pubDate>Sat, 12 Oct 2019 21:10:01 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3812438</link>
        <description><![CDATA[amk: Вики пишут такие же люди, как и присутствующие здесь. И авторы статьи не всегда досконально разбираются в вопросе. Причём бывают ситуации, когда разбирающийся специалист исправляет статью, а потом приходит модератор и правит всё обратно к неправильному виду.<br>У структуры данных как объекта есть базовые операции - их надо обязательно реализовывать, иначе с ней вообще работать нельзя будет. Для стека это выше названные push, pop, isempty.<br>И могут быть дополнительные - они просто повышают удобство работы или могут быть эффективнее, чем реализация того же функционала посредством основных операций. Это могут быть операции peek (другое название top - верхний элемент стека), size (число элементов в стеке), swap (переставляет два верхних элемента), peek(n) (выдаёт n-й элемент от вершины не меняя стека), pick(n) (вытаскивает n-й элемент, удаляя его из стека), roll(n) (циклически проворачивает n верхних элементов стека), и т.д. - дополнительных операций можно придумать столько, сколько придёт в голову. Для примера можно посмотреть список слов языка FORTH, предназначенных для работы со стеком.]]></description>
        <author>amk</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3812429</guid>
        <pubDate>Sat, 12 Oct 2019 19:32:22 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3812429</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811868'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T12:22:05+00:00">04.10.19, 12:22</time></span><div class='quote '>eek:<br>
    if not isempty<br>
        pop(var)<br>
        push(var)<br>
        return var<br>
    else<br>
        return NULL</div></div><br>
<br>
ну, я это и имел в виду, когда писал, что:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811860'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T11:15:46+00:00">04.10.19, 11:15</time></span><div class='quote '>Придется удалять верхний элемент, при этом запомнив занчение, потом его распечатать и добавить обратно в стек? Т е последовательно вызываем pop, а затем push??</div></div><br>
<br>
в общем, ладно, спс <strong class='tag-b'>Akina</strong>, но все равно, какая-то недосказанность в моем понимании по стеку есть в принципе)<br>
<br>
а насчет вики, ну, там ведь и норм.информация есть), т е, например, относительно того же стека, 95% вполне, а вот с базовыми операциями какая-то нестыковка, ну, ладно в общем...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811868</guid>
        <pubDate>Fri, 04 Oct 2019 12:22:05 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811868</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811860'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T11:15:46+00:00">04.10.19, 11:15</time></span><div class='quote '>значит инфа из главной ссылки вики уже неточная, т к там написано, что: &quot;Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и чтение головного элемента (peek)&quot;.<br>
<br>
как тогда получить значение ВЕРХНЕГО ЭЛЕМЕНТА, через эти 3 базовые??</div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">peek: </div><div class="code_line">&nbsp;&nbsp; &nbsp;if not isempty </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop(var)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push(var)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return var</div><div class="code_line">&nbsp;&nbsp; &nbsp;else </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return NULL</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811860'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T11:15:46+00:00">04.10.19, 11:15</time></span><div class='quote '>там написано, что: &quot;Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и чтение головного элемента (peek)&quot;.</div></div><br>
Ага-ага... ну-ка, реализуй через эти &quot;базовые&quot; операции проверку, что стек непуст. Обязательное условие - в процессе выполнения кода не должно возникнуть ошибки. Скрытое обязательное условие - состояние стека в принципе неизвестно, известно только, что он существует, и что он именно стек.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811860'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T11:15:46+00:00">04.10.19, 11:15</time></span><div class='quote '> при работе со стеком МОЖНО ТОЛЬКО ИСПОЛЬЗОВАТЬ БАЗОВЫЕ ОПЕРАЦИИ push, pop, isempty и ничего другого в принципе, т е ЛЮБАЯ производная операция должна состоять из комбинации базовых. В окружении при этом могут быть доп.переменные, указатели и пр, но, когда идет взаимодействие со стеком, то допустимы ТОЛЬКО базовые и все?</div></div><br>
Именно так. Суть базовых операций в том, что ЛЮБАЯ мыслимая операция может быть выполнена с использованием ТОЛЬКО базовых операций. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811860'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T11:15:46+00:00">04.10.19, 11:15</time></span><div class='quote '>в вики уже не достоверная инфа относительно стека.</div></div><br>
Ну ты прям америку открыл... да там сплошь и рядом такое написано, что хоть за голову хватайся. Никто ж за написанное там ни материальной, ни уголовной ответственности не несёт...]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811865</guid>
        <pubDate>Fri, 04 Oct 2019 11:42:42 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811865</link>
        <description><![CDATA[OpenGL: По-моему ты на каких-то мелочах концентрируешься.]]></description>
        <author>OpenGL</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811860</guid>
        <pubDate>Fri, 04 Oct 2019 11:15:46 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811860</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811850'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2019-10-04T09:13:06+00:00">04.10.19, 09:13</time></span><div class='quote '>Базовых операций всего три - push, pop, isempty.</div></div><br>
допустим, значит инфа из главной ссылки вики уже неточная, т к там написано, что: &quot;Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и <span class="tag-color tag-color-named" data-value="red" style="color: red">чтение головного элемента (peek)</span>&quot;.<br>
<br>
Как видишь, нет ни слова про isempty. Нет, я не утверждаю, что ты не прав, ни в коем случае, а лишь то, что в вики уже не достоверная инфа относительно стека. Так получается, да? Кстати, в некоторых др.источниках (не таких авторитетных, как вики в области КОМПЬЮТЕР САЙНС), как раз за 3-ю базовую операцию брали isempty, а peek-а там не было.<br>
<br>
Допустим, всего 3 базовых операции: push, pop, isempty. Сразу договоримся, что pop удаляет и ВОЗВРАЩАЕТ ЗНАЧЕНИЕ УДАЛЕННОГО элемента (в примере кода выше у меня не так). А как тогда получить значение ВЕРХНЕГО ЭЛЕМЕНТА, через эти 3 базовые?? Придется удалять верхний элемент, при этом запомнив занчение, потом его распечатать и добавить обратно в стек? Т е последовательно вызываем pop, а затем push??<br>
<br>
Или все-таки достаточно прописать <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(return top-&#62;value)</div></ol></div></div></div></div>? Вот это тоже важнейший момент. Хочу понять, что при работе со стеком МОЖНО ТОЛЬКО ИСПОЛЬЗОВАТЬ БАЗОВЫЕ ОПЕРАЦИИ push, pop, isempty и ничего другого в принципе, т е ЛЮБАЯ производная операция должна состоять из комбинации базовых. В окружении при этом могут быть доп.переменные, указатели и пр, но, когда идет взаимодействие со стеком, то допустимы ТОЛЬКО базовые и все? или не так все-таки?]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811853</guid>
        <pubDate>Fri, 04 Oct 2019 09:53:21 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811853</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415904&view=findpost&p=3811832'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2019-10-03T23:25:16+00:00">03.10.19, 23:25</time></span><div class='quote '>то в этом случае от этой структуры СТЕК нужно отказываться и использовать линейный список</div></div><br>
Линейный список вообще редко когда нужен.]]></description>
        <author>OpenGL</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811850</guid>
        <pubDate>Fri, 04 Oct 2019 09:13:06 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811850</link>
        <description><![CDATA[Akina: Базовых операций всего три - push, pop, isempty.<br>Получение (элемента с вершины, всего стека для печати и пр.) не являются базовыми, ибо они легко реализуются последовательностью из нескольких базовых операций. Ну и плюс использование внешних для стека массива/коллекции/ещё чего-нить, что вообще к делу не относится.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811832</guid>
        <pubDate>Thu, 03 Oct 2019 23:25:16 +0000</pubDate>
        <title>Кое-что непонятно по структуре СТЕК</title>
        <link>https://forum.sources.ru/index.php?showtopic=415904&amp;view=findpost&amp;p=3811832</link>
        <description><![CDATA[FasterHarder: Всем хай&#33; Сходу к делу&#33;<br>
Перечитав с 10-ок статей по стеку (и некоторые книги) начинаю сомневаться, что основательно понимаю эту АТД. Моя задача на глубочайшем уровне понять принцип работы стека, хотя это простейшая структура и кодил ее раз 200, наверное.<br>
top - указатель на вершину стека (глобальная переменная, как пример), стек целых чисел, примеры кода будет на чистом СИ.<br>
Реализация на динамическом списке (не статик и не динамик массив).<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">struct TElem</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int value;</div><div class="code_line">&nbsp;&nbsp;struct TElem* next;</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">1-я проблема:</span> разные источники называют <span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>РАЗНЫЕ БАЗОВЫЕ ОПЕРАЦИИ</strong></span> над стеком. 100%, что нужна операция push (добавление элемента на вершину стека) и pop (удаление элемента из вершины стека). Дальше начинаются разночтения. Где-то говорится об операции peek (получение значения верхнего элемента стека без удаления самого элемента), empty (проверка стека на пустоту), print(печать элементов стека). На мой взгляд, это наиважнейший момент в понимании стека - нужно определить БАЗОВЫЕ ОПЕРАЦИИ, т к любые производные операции должны основываться на базовых. Вот какие операции допустимы над классическим стеком?? push, pop, peek? и ВСЕ?? НИЧЕГО ДРУГОГО НЕЛЬЗЯ ни при каких условиях??<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// добавление элемента в вершину стека</div><div class="code_line">void push(int pvalue)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct TElem* add = &#60;вызывается функция создания элемента&#62;;</div><div class="code_line">&nbsp;&nbsp;add-&#62;next = top;</div><div class="code_line">&nbsp;&nbsp;top = add;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// удаление элемента из вершины стека</div><div class="code_line">void pop(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct TElem* del = top;</div><div class="code_line">&nbsp;&nbsp;top = del-&#62;next;</div><div class="code_line">&nbsp;&nbsp;free(del);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// получение значения верхнего элемента стека</div><div class="code_line">int peek(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (top-&#62;value);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
понятно, что функции peek, pop вызываются только тогда, когда в стеке есть хотя бы 1 элемент, т е перед вызовом придется делать проверку аля <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if(top != NULL)</div></ol></div></div></div></div>, иначе крах прожки в процессе работы.<br>
<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">2-я проблема:</span> допустим, очень часто &quot;просят&quot; вывести все элементы стека на экран. Раньше я делал так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void print(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct TElem* print = top;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;Элементы стека: &quot;);</div><div class="code_line">&nbsp;&nbsp;while(print != NULL)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;\t%d&quot;, print-&#62;value);</div><div class="code_line">&nbsp;&nbsp; &nbsp;print = print-&#62;next;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
но ведь так делать нельзя, т к изначально СТЕК не позволяет операцию движения вдоль стека. Стек говорит, ты можешь печатать, что хочешь, но использовать можешь лишь набор базовых операций: push, pop, peek(?).<br>
Означает ли это, что такая функция print недопустима? Придется делать так:<br>
1. взяли peek, запомнили в переменную и вывели на экран<br>
2. вызываем push, куда добавляется элемент во вспомогательный стек. На самом деле push должен иметь параметром указатель на начало стека, чтобы можно быдо добавлять в разные стеки.<br>
3. вызываем pop из первоначального стека.<br>
и в цикле крутим эти 3 операции, пока первоначальный стек не будет удален ПОЛНОСТЬЮ. при этом рядом образуется вспомогательный перевернутый стек. Потом нужно сделать обратный переворот вспомогательного стека (уже без печати элементов), чтобы восстановить первоначальный. Все это геморрно, но зато это полностью соот-ет базовым операциям стека.<br>
<br>
Или, допустим, потребуется удалить лишь четные элементы из стека. Базовой операции такой не предусмотрено, поэтому, если и пытаться ее реализовывать, то только, используя базовые. Ведь так, да?<br>
<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">3-я проблема</span>: я правильно понимаю, что стек нужно применять лишь в тех алгоритмах, которые будут использовать стек по классическому назначению? Например, я помню, что в некоторых графовых алгоритмах задействуют стек/очередь, при этом не требуют никаких переворотов, печатей всех элементов, а используют лишь push, pop, peek и НИ КОПЕЙКИ БОЛЬШЕ&#33; Если, при решении какой-либо задачи, требуется обработка стековых данных таким образом, что добавляет новые операции над стеком, то в этом случае от этой структуры СТЕК нужно отказываться и использовать линейный список (хотя в каком роде стек частный обрезанный случай ЛОС), например??<br>
<br>
Вообще, чем больше это все изучаю, тем больше понимаю, что тонкостей миллион. Не нужно мне писать про природу данных, которые хранятся в стеке. ЧТо разные данные требуют различной обработки. Это понятно, меня интересует стек как контейнер для ОДНОЗНАЧНОЙ обработки ЛЮБЫХ данных (абстрактность в этом ведь проявляется)<br>
<br>
подскажите как быть-то? спс за внимание&#33;]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	