IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Как сосчитать количество закрывающихся скобок?, Трудная задачка
Новичок
сообщение 17.03.2005 14:05
Сообщение #1


Гость






Есть строка, в которой есть скобки - открывающиеся и закрывающиеся. Если скобок не равное количество, то надо вывести "количество скобок не равно", (это просто), а если равное, то проверить нет ли где-нибудь такой ситуации, что открывающаяся скобка стоит после закрывающейся (это трудно) =)
 К началу страницы 
+ Ответить 
SHnur
сообщение 17.03.2005 14:40
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской
Реальное имя: Шурик

Репутация: -  0  +


Это легко можно реализовать при помоши стека (можно даже не динамического стека , реализованого на массиве ).

Алгоритм такой :

Код
for i := 1 to {длина строки ...} do begin
  {если нашли открывающуюся скобку то добовлякм в стек}
  {иначе смотрим на вершину стека , если там откр.скобка , то удаляем её}
       {иначе , выходим из цикла , (уже есть случай неправильной постоновки скобок)}
end;
{если пройден весь цикл , то проверяем стек , если он НЕ пустой , то (уже есть случай неправильной постоновки скобок)}


Вот возможный вариант решения :

Код
program skobki;
var stek : array[1..255] of char;
   head : byte;

function isempty:boolean;
begin
  isempty := (head = 0)
end;
procedure POP;
begin
  if not(isempty) then dec(head);
end;
procedure PUSH(c:char);
begin
  inc(head);
  stek[head] := c;
end;
function showHead:char;
begin
  showHead := stek[head];
end;

var wrong :boolean;
   i : byte;
   input : string;
begin
  head := 0;
  for i := 1 to 255 do stek[i] := ' ';
  wrong := false;

  writeln('input :');
  readln(input);

  for i := 1 to ord(input[0]) do begin
     if input[i] = '(' then PUSH(input[i])
     else if input[i] = ')' then
        if showHead = '(' then POP
        else begin wrong := true; break; end;
  end;
  if not(wrong) then wrong := not(isempty);
  writeln(wrong);
  readln;
end.


Сообщение отредактировано: SHnur - 17.03.2005 14:59


--------------------
Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.03.2005 16:30
Сообщение #3


Гость






Новичок
Поиском здесь кто-нибудь будет пользоваться? Есть же решения ...
http://forum.pascalnet.ru/index.php?showt...%EA%EE%E1%EA%E8
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 19:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"