<?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=42035&amp;view=findpost&amp;p=308503</guid>
        <pubDate>Mon, 01 Mar 2004 19:28:54 +0000</pubDate>
        <title>Анализ скобочной структуры</title>
        <link>https://forum.sources.ru/index.php?showtopic=42035&amp;view=findpost&amp;p=308503</link>
        <description><![CDATA[tserega: Еще один вариант решения данной задачи:<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">Function IsCorrect(Expr : String) : Boolean;</div><div class="code_line">Var R : Boolean;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Repeat</div><div class="code_line">&nbsp;&nbsp;R:=False;</div><div class="code_line">&nbsp;&nbsp;If (Pos(&#39;()&#39;, Expr) &#62; 0) Then</div><div class="code_line">&nbsp;&nbsp; Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Delete(Expr, Pos(&#39;()&#39;, Expr), 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;R:=True;</div><div class="code_line">&nbsp;&nbsp; End;</div><div class="code_line">&nbsp;&nbsp;If (Pos(&#39;{}&#39;, Expr) &#62; 0) Then</div><div class="code_line">&nbsp;&nbsp; Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Delete(Expr, Pos(&#39;{}&#39;, Expr), 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;R:=True;</div><div class="code_line">&nbsp;&nbsp; End;</div><div class="code_line">&nbsp;&nbsp;If (Pos(&#39;[]&#39;, Expr) &#62; 0) Then</div><div class="code_line">&nbsp;&nbsp; Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Delete(Expr, Pos(&#39;[]&#39;, Expr), 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;R:=True;</div><div class="code_line">&nbsp;&nbsp; End;</div><div class="code_line">&nbsp;Until R = False; </div><div class="code_line">&nbsp;IsCorrect:=Length(Expr) = 0;</div><div class="code_line">End;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Пока нам встречается последовательность из открывающей и закрывающей скобки одного вида, мы их удаляем. В конце:<br>
а) если удалены все скобочные пары (т.е. длина строки в конце равна 0), то скобочное выражение корректно<br>
б) не все скобки удалены - значит, скобочное выражение неверно<br>
<br>
Пример:<br>
({[()]})[{}]<br>
Сначала алгоритм находит () : ({[]})[{}]<br>
Потом {}: ({[]})[]<br>
Потом 2 раза []: ({})[] и ({})<br>
Опять {}: ()<br>
И, наконец, (): пустая строка<br>
Скобочное выражение было верным.]]></description>
        <author>tserega</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=42035&amp;view=findpost&amp;p=274567</guid>
        <pubDate>Sat, 03 Jan 2004 12:12:58 +0000</pubDate>
        <title>Анализ скобочной структуры</title>
        <link>https://forum.sources.ru/index.php?showtopic=42035&amp;view=findpost&amp;p=274567</link>
        <description><![CDATA[Some1: Для различного типа скобок можно сформулировать ещё одно важное, но очевидное правило:<br>
Скобочные пары двух или более разных типов не могут иметь пересекающуюся структуру.<br>
Вот пример, демонстрирующий правильность этого утверждения:<br>
[{]} - тут нём две скобочные пары пересекаются, хотя и формируют (независимо друг от друга) верные пары.<br>
При дальнейшем рассмотрении этого правила можно заметить такое следствие: внутри любой пары скобок одного типа может быть только лишь чётное количество скобок другого типа, либо их может вообще не быть. Если это число не чётное, то содержимое этой пары скобок сформировано неправильно.<br>
<span class="tag-font" data-value="Courier" style="font-family:Courier">12345678<br>
([{})])</span><br>
Если выбрать первую и пятую или первую и седьмую скобки за пару, то внутри них будет нечётное количество скобок, что говорит о неверности выражения.]]></description>
        <author>Some1</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=42035&amp;view=findpost&amp;p=274445</guid>
        <pubDate>Sat, 03 Jan 2004 03:59:44 +0000</pubDate>
        <title>Анализ скобочной структуры</title>
        <link>https://forum.sources.ru/index.php?showtopic=42035&amp;view=findpost&amp;p=274445</link>
        <description><![CDATA[@Hgpeu: <strong class='tag-b'>Анализ скобочной структуры.</strong><br>
<br>
Иногда возникает проблема проверки корректности скобочной структуры. Рассмотрим подробно эту проблему.<br>
<br>
<strong class='tag-b'>Скобки одного вида.</strong><br>
<br>
Пусть в строке хранится выражение, содержащее скобки: ‘(’ и ’)’. Для понятности определения корректности скобочной структуры рассмотрим примеры:<br>
( ( ) ) – скобочная структура корректна<br>
( ( ) – скобочная структура не корректна<br>
( ) ) – скобочная структура не корректна<br>
Из рассмотренных примеров можно выдвинуть гипотезу. <br>
Гипотеза: «Скобочная структура корректна когда количество открывающих скобок ‘(’ равно количеству закрывающих ‘)’»<br>
Но рассмотрим контр пример: ) ( - скобочная структура не корректна. <br>
Но по нашей гипотезе данная скобочная структура будет считаться корректной.<br>
В данном случае количество открывающих скобок равно количеству закрывающих, но закрывающая скобка идет раньше, чем открывающая. Из этих утверждений сформулируем правило: «Скобочная структура корректна тогда и только тогда, когда количество открывающих скобок ‘(’ равно количеству закрывающих ‘)’ и нет такого момента времени (при проверке скобок слева направо по одной) когда количество закрывающих скобок больше чем открывающих».<br>
Заведем переменную Rang – числовая характеристика корректности скобочной структуры. <br>
В процессе проверки если встречаем ‘(’ то увеличиваем rang на 1, если ’)’, то уменьшаем rang на 1.<br>
Тогда правило переформулируется так: «Если в процессе проверки rang не был меньше 0, а в конце проверки rang = 0, то такая скобочная структура корректна»<br>
<br>
<span class='tag-u'>Алгоритм проверки:</span><br>
1. Ввод данных<br>
2. Rang:=0;<br>
3. i:=1;<br>
4. Если i’ый элемент строки ‘(’, то увеличиваем Rand на 1<br>
5. Если i’ый элемент строки ‘)’, то уменьшаем Rand на 1<br>
6. увеличить i на 1<br>
7. Если i больше чем длина строки или Rang &lt; 0 то перейти к п.9<br>
8. Перейти к п. 4<br>
9. Если Rang = 0 то вывод (‘Структура корректна’) иначе вывод(‘Структура не корректна’)<br>
10. Конец<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">var s:string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i,rang:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln(&#39;Введите строку&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln(s);</div><div class="code_line">&nbsp;&nbsp; &nbsp; rang:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; for i:= 1 to length(s)do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if s[i]=&#39;(&#39;then inc(rang);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if s[i]=&#39;)&#39;then dec(rang);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if rang&#60;0 then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if rang=0 then writeln(&#39;Скобочная структура верна&#39;) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else writeln(&#39;Скобочная структура не верна&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Три вида скобок</strong><br>
Пусть у нас есть строка содержащая 3 вида скобок: ‘(‘, ‘)’, ’[’ , ’]’, ’{’, ’}’.<br>
Использование 3х типов скобок не позволяют создать правильный алгоритм анализа скобочной структуры с использованием Rang. Воспользуемся <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=41760' target='_blank'>стеком</a>.<br>
<br>
<span class='tag-u'>Алгоритм.</span><br>
1. Двигаемся вдоль скобочной структуры.<br>
2. Если встретилась открывающая скобка любого вида, то помещаем её в стек.<br>
3. Если встретилась закрывающая скобка, то извлекаем из стека верхнюю скобку и сравниваем их тип (Например ‘{’ и ’}’ – одного типа)<br>
Если скобки непарные, то скобочная структура неверна.<br>
4. Если в процессе анализа была попытка извлечения из пустого стека, то скобочная структура неверна.<br>
5. Если после завершения проверки стек не пуст, то скобочная структура неверна.]]></description>
        <author>@Hgpeu</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	