
Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов только один -
Delphi procedure TForm1.Button4Click(Sender: TObject); var Buff: TNodePointer; x: TItem; i: Cardinal; begin i:=0; Buff:=Head; if(Buff^.Next=nil) then begin ShowMessage('В стеке один элемент!'); exit; end; while Buff <> nil do begin if(Buff^.Data=Buff^.Next^.Data) then begin while (Buff^.Next<>nil) and (Buff^.Data=Buff^.Next^.Data) and not(isEmpty(Buff)) do begin pop(Buff^.Next,x); for i:=0 to StringGrid1.RowCount-2 do begin StringGrid1.Cells[0,i]:=StringGrid1.Cells[0,i+1] end; StringGrid1.RowCount:=StringGrid1.RowCount-1; end; end; Buff:=Buff^.Next; end; end; end. Помогите с данной задачей, в общем если ввести к примеру 1 2 3 4 5 5 5 5 , то останется 1 2 3 4 5, а если ввести 1 2 3 4 5 5 5 5 6, то остается 1 2 3 4 5 5, не знаю с чем связано. Скорее всего ошибка с выводом на StringGrid Так же прикладываю проект https://yadi.sk/d/C7AuwnlM3Gnf8Y

Ответы на вопрос

var Buff: TNodePointer;
x: TItem;
i,j: Cardinal;
begin
i:=0;
Buff:=Head;
if(Buff^.Next=nil) then
begin
ShowMessage('В стеке один элемент!');
exit;
end;
while Buff <> nil do
begin
while (Buff^.Next<>nil) and (Buff^.Data=Buff^.Next^.Data) and not(isEmpty(Buff)) do
begin
pop(Buff^.Next,x);
for j:=i to StringGrid1.RowCount-2 do
StringGrid1.Cells[0,j]:=StringGrid1.Cells[0,j+1];
StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;
Buff:=Buff^.Next;
i:=i+1;
end;
end;
PS. Delphi у меня сейчас нет, так что проверяйте сами. Если что не так - сообщайте.



Для решения данной задачи, вам нужно пройти по всему стеку и проверить, есть ли подряд идущие символы с одинаковыми значениями. Если такие символы найдены, то нужно удалить все, кроме первого из них.
В коде, который вы предоставили, есть несколько проблем. Во-первых, вы используете функцию isEmpty(Buff), которую я не вижу в предоставленном коде. Во-вторых, вы не вызываете функцию pop(Buff,x) для удаления элементов из стека. В-третьих, вы не обновляете значения в StringGrid1 после удаления элементов из стека.
Вот исправленный код, который должен решить вашу задачу:
```delphi procedure TForm1.Button4Click(Sender: TObject); var Buff: TNodePointer; x: TItem; i: Integer; begin i := 0; Buff := Head;
if Buff = nil then begin ShowMessage('Стек пустой!'); Exit; end;
while Buff^.Next <> nil do begin if Buff^.Data = Buff^.Next^.Data then begin while (Buff^.Next <> nil) and (Buff^.Data = Buff^.Next^.Data) do begin pop(Buff^.Next, x);
// Обновляем значения в StringGrid1 for i := 0 to StringGrid1.RowCount - 2 do StringGrid1.Cells[0, i] := StringGrid1.Cells[0, i + 1]; StringGrid1.RowCount := StringGrid1.RowCount - 1; end; end; Buff := Buff^.Next; end; end; ```
Теперь код должен работать корректно и оставлять только один символ из группы подряд идущих символов с одинаковыми значениями в стеке.


Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili