Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Класс, реализующий очередь

12K
14 ноября 2005 года
brusher
6 / / 10.11.2005
Привет всем!
Возникла необходимость сделать класс, реализующий очередь в Visaul C++. В нем надо реализовать удаление и добавление элемента, выдача n-ого элемента, длины очереди, находить средний элемент. Плиз, очень надо, приперло очень сильно, если не влом напишите, а то лох я по этим делам, а в институте требуют! X)-
7.5K
19 ноября 2005 года
khasya
17 / / 06.02.2005
Цитата:
Originally posted by brusher
Привет всем!
Возникла необходимость сделать класс, реализующий очередь в 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;
}


12K
19 ноября 2005 года
brusher
6 / / 10.11.2005
Цитата:
Originally posted by khasya
Вот реализация стека на BC3.1. Думаю, все что надо для очереди здесь есть.


Спасибо большое, как раз то, что надо!

17K
13 мая 2006 года
wadara
2 / / 09.04.2006
Цитата:
Originally posted by brusher
Привет всем!
Возникла необходимость сделать класс, реализующий очередь в 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]

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог