Привет,всем! Возникла проблемка с созданием кольцевой очереди на основе дин распр памяти.....прога должна выполнять след действия..(Пустая очередь содержит только заголовочный элемент),проверка заполненостиочереди проводить не нужно. • проверку пустоты очереди • добавление элемента в конец очереди • удаление элемента из начала очереди • вывод текущего состояния очереди на экран а требования к ней.. • все действия должны быть оформлены как процедуры или функции • добавлению/удалению должна предшествовать проверка возможности выполнения этих операций • главная программа реализует следующий набор действий: o инициализация пустого стека o организация диалогового цикла с пользователем У меня есть также исходник кольцевой очереди на основе массива..
type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; Edit1: TEdit; Label1: TLabel; Panel1: TPanel; Label2: TLabel; Button3: TButton; Button4: TButton; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure OtobragenieOcheredi(); procedure UdalenieIzOcheredi(); procedure InicializaciiaOcheredi(); function OcheredPusta(): Boolean; // фунция возвращает истину(true) когда очередь пуста function OcheredPolna(): Boolean; procedure DobavlenieVOchered(Element: string); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private Last: byte;{ukazatel na konec ocheredi} First: byte; {указатель на начало очереди} Pusto,Polno: Boolean; {Используются в процедурах определения пустоты и заполненности} { Private declarations } public { Public declarations } end;
var Form1: TForm1; mas: array [1..10]of string;// zadaem mas tipa string(chtobi bukvi)
implementation
{$R *.dfm} procedure TForm1.DobavlenieVOchered(Element: string); var TempLast: Byte; begin TempLast:=Last; Last:=Last+1; // uvelichenie na 1 (Inc(Last)) na sled element (perenos) if Last=11 then Last:=1; if Not(OcheredPolna()) then begin Pusto:=false; mas[Last]:= element; OtobragenieOcheredi(); end else begin ShowMessage('Очередь полна'); Last:=TempLast; end; if Last=First then Polno:=true else Polno:=false; end;
function TForm1.OcheredPusta(): Boolean; begin result:=false; if Pusto then result:=true; end;
function TForm1.OcheredPolna(): Boolean; begin result:=false; if Polno then result:=true; // esli bolshe 10 to istina end;
procedure TForm1.UdalenieIzOcheredi(); var TempFirst: Byte; begin TempFirst:=First; // Запоминаем хвост если удаление не удастся то восстановим его First:=First+1; // uvelichenie na 1 (Inc(Last)) na sled element (perenos) if First=11 then First:=1; // Если конец массива перескакиваем в начало if not(OcheredPusta()) then begin mas[First]:=''; OtobragenieOcheredi(); end else begin First:=TempFirst; // Удаление не удалось восстанавливаем хвост ShowMessage('Удаление невозможно, очередь пуста!'); end; if Last=First then Pusto:=true // Хвост догнал голову else Pusto:=false; Polno:=false; end;
procedure TForm1.InicializaciiaOcheredi(); begin First:=10; // Следующим будет удаляться 0-й элемент 10 максимум Last:=10; // Аналогично для добавления Pusto:=true; // В начале очередь пуста Polno:=false; // В начале очередь не заполнена end;
procedure TForm1.OtobragenieOcheredi(); var i: byte; // peremennaa cikla begin for i:=0 to 9 do //ochishat tablicy ot starih znach StringGrid1.Cells[0,i]:=''; // vsec stroki pereber i ochichaem if Not(OcheredPusta()) then for i:=0 to 9 do //vivodim massiv b cikle v tablicy StringGrid1.Cells[0,i]:=mas[i+1] // izza 1-s otchet idet poetomy tak end;
procedure TForm1.Button1Click(Sender: TObject); begin if Edit1.Text='' then ShowMessage('введите элемент для добавления') else DobavlenieVOchered(Edit1.Text); end;
procedure TForm1.FormCreate(Sender: TObject); begin InicializaciiaOcheredi(); end;
procedure TForm1.Button2Click(Sender: TObject); begin UdalenieIzOcheredi(); end;
procedure TForm1.Button3Click(Sender: TObject); begin if OcheredPolna() then ShowMessage('Очередь полна') else ShowMessage('Очередь не полна'); end;
procedure TForm1.Button4Click(Sender: TObject); begin if OcheredPusta() then ShowMessage('Очередь пуста') else ShowMessage('Очередь не пуста'); end;