Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на последовательность скобок
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
XimeR
Собственно задача :

Дана последовательность круглых фигурных и квадратных скобок. Определить, нет ли "пересечения" скобок. Например, последовательность (([)])() НЕправильна, а последовательность (([()])()) - правильна.
Нашел исходник:
Код

var s:string;    
    c:byte;    
    b:boolean;    
begin    
     readln(s);    
     b:=true;    
     while b do    
      begin    
       b:=false;    
       c:=pos('[]',s);    
       if c>0 then    
        begin    
         delete(s,c,2);    
         b:=true;    
        end;    
       c:=pos('()',s);    
       if c>0 then    
        begin    
         delete(s,c,2);    
         b:=true;    
        end;    
       c:=pos('{}',s);    
       if c>0 then    
        begin    
         delete(s,c,2);    
         b:=true;    
        end;    
      end;    
    if length(s)>0 then writeln('No')    
    else writeln('Yes');    
end.


Возникла еще одна сложность.
Если есть "пересечение", то при выводе строки на экран надо выделить цветом те скобки, из-за которых произошло "пересечение". Как реализовать?(с моими небольшими знаниями...)
Или тут придется по-другому писать? Может исходник со стеком видел кто...
Гость
Цитата(XimeR @ 3.06.2009 13:01) *

при выводе строки на экран надо выделить цветом те скобки, из-за которых произошло "пересечение".
Не совсем ясно. Вот в этом примере выдели, пожалуйста, красным, то, что нужно:

( [ ( ] )
Гость
А также вот в этом:

( ( ( ( ( ( (

И вот в этом:

) ) ) ( ( (
amega
вся задача со скобками сводится к стеку.. написать поцедуру пуш и поп и потом прото проверять последний елемент.
XimeR
Цитата(amega @ 3.06.2009 17:48) *

вся задача со скобками сводится к стеку.. написать поцедуру пуш и поп и потом прото проверять последний елемент.

Видел такие советы в инете, но блин в стеках и прочем я не силен, т.к. еще это не изучил...=(
А исходник только один нашел, который выложил...

А в этом коде не корректные скобки никак не подстветить при выводе?
volvo
Цитата
но блин в стеках и прочем я не силен, т.к. еще это не изучил...=(
В таком случае уточни, что ты уже изучил. Это первое.

А второе - тебе задали вопрос, что выделять в трех приведенных случаях. Ты его оставил без ответа. Почему?
XimeR
Цитата(volvo @ 3.06.2009 21:56) *

В таком случае уточни, что ты уже изучил. Это первое.

А второе - тебе задали вопрос, что выделять в трех приведенных случаях. Ты его оставил без ответа. Почему?


Изучил мало...Вообще ничего....Все только ур-нь школы - массивы, процедуры и ф-ии...

Цитата
А второе - тебе задали вопрос, что выделять в трех приведенных случаях. Ты его оставил без ответа. Почему?

Ну я вообще-то не понял, к чему эти скобки...У меня ведь в примере ищет и удаляет пару скобок, которая содержит и открытую, и закрытую...Находит - удаляет....Если в строке ничего, то правильно, если осталось что-то, то то и выделить нужно...
volvo
Цитата
У меня ведь в примере ищет и удаляет пару скобок, которая содержит и открытую, и закрытую...Находит - удаляет...
Это проблемы твоей реализации... По заданию ты ничего не должен удалять, там сказано:
Цитата
Определить, нет ли "пересечения" скобок.
, и все, ни о каких удалениях речь не идет...
XimeR
Цитата(volvo @ 7.06.2009 16:11) *

Это проблемы твоей реализации... По заданию ты ничего не должен удалять, там сказано: , и все, ни о каких удалениях речь не идет...


smile.gif Тогда как решать задачу?
Lapp
Цитата(XimeR @ 7.06.2009 17:44) *
Тогда как решать задачу?
Очень просто - нажимай на клавиши в нужной последовательности smile.gif.

Цитата(XimeR @ 7.06.2009 15:17) *
Если в строке ничего, то правильно, если осталось что-то, то то и выделить нужно...
Вот и выдели, в тех примерах, которые я привел (гостем). В форме ответа есть кнопочка для цвета текста, воспользуйся ей, пожалуйста.

Если условие неясно - как решать задачу? blink.gif

XimeR
Цитата(Lapp @ 8.06.2009 6:30) *

Вот и выдели, в тех примерах, которые я привел (гостем). В форме ответа есть кнопочка для цвета текста, воспользуйся ей, пожалуйста.

blink.gif Тогда не пойму вообще....Если по примеру смотреть, то я думал в последовательности выделяем ( [ ( ] ) (из-за них произошло пересечение)
И ( ( ( ( ( ( (
И ) ) ) ( ( (.... ( неправильные последовательности)
А выходит я не прав? nea.gif
Lapp
Цитата(XimeR @ 8.06.2009 17:22) *
А выходит я не прав?
Откуда нам знать, прав ли ты. Из тебя не так просто вытягивать информацию. Ты никак не хочешь понять, что задача не до конца поставлена. И кто будет тогда ее решать?
Если стену надо покрасить в красный - нет проблем. Если в полосочку с цветочками - тоже. А если говорят: "покрась, неизвестно как, но не ошибись!" - то извини..
Вот этот пример мне так и неясен:
( [ ) ]
Кто кому мешает? Если отбрезать:
( [ )
- то вроде ясно, что [ лишняя, ее надо выделять. Так? Но тогда совсем неявсно, что выделять в первом примере.
XimeR
Цитата(Lapp @ 9.06.2009 0:17) *

Вот этот пример мне так и неясен:
( [ ) ]
Кто кому мешает? Если отбрезать:
( [ )
- то вроде ясно, что [ лишняя, ее надо выделять. Так? Но тогда совсем неявсно, что выделять в первом примере.

Тогда я сам в тупике...Я думал, что надо выделить скобки, в которых "произошло пересечение"...
Пример неправильной последовательности :
(([)])() ===> (([)])
Или 2 пары скобок (([)])
Что правильней сам не пойму wacko.gif

___________________________________________
Вот еще наработка...Но в коде я не разбирался и врядли разберусь быстро.
Код

type
  s=str[80];
  yk=^el;
  el=record
   inf:byte;
   adr:yk;
     end;
var  
  str:s;
  p:integer;
  na:yk;
const
  otkr:s=['(','[','{'];
  zakr:s=[')',']','}'];
function poisk(str[k]:char):integer;
procedure vkl(nom:byte);
...
begin
  writeln('vvedite stroku');
  readln(str);
  k:=1;
  while k<=streln(str) do
       begin
         p:=poisk(str[k]);
         if p<>0 then
                     if p>0 then vkl(p)
                     else
                         begin
                           os=izwl;
                           if os=o then writeln (...);
                           if os<>-p then writeln ('ne ta otkr.skobka');
                         end;
       inc(k);
       end;
  if izwl <>0 then writeln ('lishnie skobki');
end.


Может кто-нибудь помочь дописать\исправить, а то я еще не разобрался, а надо, чтобы работала...
Archon
Если смотреть по логике работы стека, то выделять надо так:
( [ ( ] )
( [ ) ]
( ( ( ( ( ( (
) ) ) ( ( (

То есть если скобка не подходит, то выделяем ее цветом и пропускаем. Примерно так:

. . .
for i := 1 to Length(Str) do begin
case Str[i] of
'(', '[': Stack.Push(Str[i]);
')': if Stack.Pop <> '(' then TextColor(Red);
']': if Stack.Pop <> '[' then TextColor(Red);
else begin
WriteLn;
WriteLn('Ошибка: посторонние символы в строке.');
Halt;
end;
end;
Write(Str[i]);
TextColor(LightGray);
end;
. . .


XimeR, попробуй привести задание дословно. Может и поймем что-то.
XimeR
Цитата

XimeR, попробуй привести задание дословно. Может и поймем что-то.

Задание дословно в 1ом посту...Но когда я показывал исходник преподу, она и сказала: "Выдели, где пересечение" blink.gif
Archon твой код под мой исходник?! wacko.gif Куда его вставить? unsure.gif
Lapp
Цитата(XimeR @ 10.06.2009 19:56) *
Archon твой код под мой исходник?! wacko.gif Куда его вставить?
Господа офицеры, прошу молчать! (С) lol.gif
Его не надо никуда вставлять, он сам по себе. Но для него нужны процедуры, которые реализуют стэк. Посмотри на эту тему в FAQе.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.