Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов...

0 голосов
50 просмотров

Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов только один - 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


Информатика (50 баллов) | 50 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Procedure TForm1.Button4Click(Sender: TObject);
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 у меня сейчас нет, так что проверяйте сами. Если что не так - сообщайте.

(194k баллов)
0

Спасибо огромное, все работает)

0

Пожалуйста.