Класс, реализующий очередь
Возникла необходимость сделать класс, реализующий очередь в Visaul C++. В нем надо реализовать удаление и добавление элемента, выдача n-ого элемента, длины очереди, находить средний элемент. Плиз, очень надо, приперло очень сильно, если не влом напишите, а то лох я по этим делам, а в институте требуют! X)-
Привет всем!
Возникла необходимость сделать класс, реализующий очередь в Visaul C++. В нем надо реализовать удаление и добавление элемента, выдача n-ого элемента, длины очереди, находить средний элемент. Плиз, очень надо, приперло очень сильно, если не влом напишите, а то лох я по этим делам, а в институте требуют! X)-
Вот реализация стека на BC3.1. Думаю, все что надо для очереди здесь есть.
//Реализация очереди на базе вектора
#include <stdio.h>
#include<conio.h>
const nmax=10;
struct queue
{
int num;
int info;
} ;
void del_Q(queue vec[],int nmax);
int emp_o_not(queue vec[],int nmax);
void add(queue vec[],int nmax,int p);
void take_el(queue vec[],int nmax);
//*************************************************************************
void main()
{
struct queue vec[nmax] ;
int p,k,d;
char ch;
int t;
clrscr();
printf(" *Реализация очереди на базе вектора*\n");
del_Q(vec,nmax) ;
k=emp_o_not(vec,nmax);
if (k==1) printf("--------Очередь пуста------------\n");
printf("Сколько элементов ввести:");
scanf("%i",&t);
for(int i=0;i<t;i++)
{
printf("Введите элемент очереди:");
scanf("%i",&k);
vec.info=k;
}
for (i=0;i<t;i++)
printf("%i",vec.info);
printf("\n");
printf("Сколько элементов добавить в очередь?");
scanf("%i",&d);
printf("Введите элементы:");
for(i=0;i<d;i++)
{
scanf("%i",&p);
add(vec,nmax,p) ;
}
t=t+d;
for (i=0;i<t;i++)
printf("%i",vec.info);
printf("Сколько удалить?");
scanf("%i",&d);
printf("\n Удаление элементов из очереди... ");
for(i=0;i<d;i++)
take_el(vec,t);
t=t-d;
printf("\nПечать очереди.....\n");
for (i=0;i<t;i++)
printf("%i",vec.info);
getch();
}
//***********************************************************************
void del_Q(queue vec[],int nmax) //сделать очередь пустой
{
for (int i=0;i<nmax;i++)
{ vec.num=0;
vec.info=0;
}
}
int emp_o_not(queue vec[],int nmax) //очередь пуста/непуста
{
int k=0;
for (int i=0;i<nmax;i++)
if (vec.info==0) k=1;
return k;
}
void add(queue vec[],int nmax,int p)//добавить элемент в очередь
{
struct queue vec1[20];
for (int i=1;i<nmax;i++)
{ vec1.info=vec[i-1].info;}
vec1[0].info=p;
vec[0].num=0;
for (i=0;i<nmax;i++)
{ vec.info=vec1.info;
vec.num=i;
}
}
void take_el(queue vec[],int nmax)
{int j=0;
while((vec[j].info!=0)||(j>nmax))
j++;
if(j<=nmax)return vec[j-1].info;
if(j>nmax)return vec[nmax-1].info;
}
Вот реализация стека на BC3.1. Думаю, все что надо для очереди здесь есть.
Спасибо большое, как раз то, что надо!
Привет всем!
Возникла необходимость сделать класс, реализующий очередь в Visaul C++. В нем надо реализовать удаление и добавление элемента, выдача n-ого элемента, длины очереди, находить средний элемент. Плиз, очень надо, приперло очень сильно, если не влом напишите, а то лох я по этим делам, а в институте требуют! X)-
Есть другой вариант реализации очереди - при помощи указателей. Например так:
[FONT=courier new]
struct DataType{ // Тип данных
int c;
int e;
};
struct OchEl{ // Элемент очереди
DataType *Data;
OchEl *next;
};
class Ocher{ //Класс очереди
void *nach;
void *kon;
int size;
public:
Ocher();
~Ocher();
void Add(DataType *ne){ //добавить элемент в конец (через указатель)
OchEl *oe=new OchEl;
if (!oe){
perror("Nekuda, kon4ilas pamat!");
return;
};
oe->Data=ne;
oe->next=0;
if (kon) ((OchEl *) kon)->next=oe;
kon=oe;
if (!nach) nach=kon;
size++;
};
DataType *Get(); //Взять элемент с начала(возвращает указатель)
DataType *GetWoDel(){ //изять элемент с конца без удаления
if (size==0) return 0;
return ((OchEl *)nach)->Data;
};
int Gsize() { return size;};
void kill();
};
Ocher::Ocher(){
nach=kon=0;
size=0;
}
Ocher::~Ocher(){ kill();}
void Ocher::kill(){
while (nach){
DataType *DT= Get();
delete DT;
};
nach=kon=0;
}
DataType *Ocher::Get(){
if (size==0) return 0;
OchEl *oe=(OchEl *) nach;
DataType *DT=oe->Data;
nach=(void *) oe->next;
delete oe;
size--;
if (!nach) kon=0;
return DT;
}
[/FONT]
В общем и целом здесь есть все необходимое тебе, очередь универсально и поэтому элемент в нее надо добавлять так:
[FONT=courier new]
ocher och;
DataType *newelement=new DataType;
newelement->c=0;
newelement->e=1;
och.Add(newelement);
[/FONT]