Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Задача с опашка

Featured Replies

Здравейте, имам следната задача: Да се състави програма за създаване на опашка от цели положителни числа, след което я разделя на два стека, съдържащи съответно четни и нечетни елементи на опашката. 

Как става това това преминаване от опашка в стек и после пак в опашка. Ако някой може да помогне със задачата ще съм му благодарен.

  • Автор

Добре направих това, но като опашка как да я разделя на стек и от нея да изкара числата

#include <iostream>
using namespace std;
struct elem
{
	int key;
	elem *next;
}*first=NULL, *last=NULL, *p;
void push(int n)
{
	p=last;
last=new elem;
last->key=n;
last->next=NULL;
if(p!=NULL)
	p->next=last;
if(first==NULL)
	first=last;
}
int pop(int&n)
{if(first)
{
	p=first;
	n=first->key;
	first=first->next;
	if(first==NULL)
		last=first;
	delete p;
	return 1;
}
else 
	return 0;
}
int main()
{int n;
cout<<"vavedete celi polojitelni chisla: ";
cin>>n;
while(n!=0)
{push(n);
cout<<"vavedete polojitelni chisla: ";
cin>>n;
}
while(pop(n))
{if(n%2==0)
	cout<<"chetno:"<<n<<"\t";
else
	cout<<"nechetno: "<<n<<"\n";
}
return 0;}

 

Нистава така, функциите ти могат да работят само с една единствена опашка,

ами ако са две както трябва да са два стековете к'о пра'им?

Или пишеш функците за опашка и стек които получават за коя опашка (стек) става въпрос като параметър

или дефинираш клас опашка и клас стек със съответните им функции.

  • Автор

Нещо не мога да разбера какво имаш предвид. Госпожата ни каза, че трябва да се направи задачата без да вкарваме библиотеки. 

struct elem {
     int key;
     elem *next;
};

class queue 
{
    elem *start;
    elem *end;
public:
    queue();
    void push(int);
    int first();
    int pop();
    int empty();
};

queue::queue()
{
     start=NULL;
     end=NULL;
}

void queue::push(int n) 
{
     elem *p=new elem;
     p->key=n;
     p->next=NULL;
     if (end) end->next=p;
     else start=p;
     end=p;
}

int queue::first()
{
    return start->key;
}

int queue::pop()
{
    elem *p=start;
    int  n=p->key;
    start=p->next;
    if (start==NULL) end==NULL;
    delete p;
    return n;
}

int queue::empty()
{
    return start==NULL;
}

 

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

struct node
{
	int data;
	node* previous;
	node* next;
};


struct spisak
{ 
	bool empty;
	node* head;
	node* tail;
	node* conductor;
	void pushback(int n);
	void pushfront(int n);
	spisak();
	~spisak();
	int popfront();
	int popback();
};


spisak::spisak()
{
	head = 0;
	tail = 0;
	conductor = 0;
	empty = true;
}

spisak::~spisak()
{
	node* monductor;
	conductor = head;
	while (conductor != 0)
	{
		monductor = conductor;
		conductor = conductor->next;
		delete monductor;
	}
}


void spisak::pushback(int n)
{
	node* pnode;
	pnode = new node;
	pnode->data = n;
	if (empty == true)
	{
		head = pnode;
		tail = pnode;
		pnode->previous = 0;
		pnode->next = 0;
		empty = false;
	}
	else
	{
		pnode->previous = tail;
		tail->next = pnode;
		tail = pnode;
		pnode->next = 0;
		empty = false;
	}
}


void spisak::pushfront(int n)
{
	node* pnode;
	pnode = new node;
	pnode->data = n;
	if (empty == true)
	{
		head = pnode;
		tail = pnode;
		pnode->previous = 0;
		pnode->next = 0;
		empty = false;
	}
	else
	{
		pnode->next = head;
		head->previous = pnode;
		head = pnode;
		pnode->previous = 0;
		empty = false;
	}
}


int spisak::popfront()
{
	int n;
	if (empty == true) return -1;
	n = head->data;
	conductor = head;
	head = head->next;
	delete conductor;
	if (head == 0)
	{
		tail = 0;
		empty = true;
	}
	return n;
}

int spisak::popback()
{
	int n;
	if (empty == true) return -1;
	n = tail->data;
	conductor = tail;
	tail = tail->previous;
	delete conductor;
	if (tail == 0)
	{
		head = 0;
		empty = true;
	}
	return n;
}

struct opashka
{
	spisak s;
	void push(int n);
	int pop();
};

void opashka::push(int n)
{
	s.pushfront(n);
}

int opashka::pop()
{
	if (s.empty == true) return -1;
	return s.popback();
}

struct stek
{
	spisak s;
	void push(int n);
	int pop();
};


void stek::push(int n)
{
	s.pushfront(n);
}

int stek::pop()
{
	if (s.empty == true) return -1;
	return s.popfront();
}

int main()
{
	int i, k;
	int n;
	cout << "n = ";
	cin >> n;
	opashka pashka;
	stek tek, chift;
	srand(time(0));
	for (i = 0; i < n; i++)
	{
		k = rand();
		pashka.push(k);
		cout << k << " ";
	}
	cout << "\n\n";
	for (i = 0; i < n; i++)
	{
		k = pashka.pop();
		if (k % 2) tek.push(k);
		else chift.push(k);
	}
	while (tek.s.empty == false)
	{
		k = tek.pop();
		cout << k << " ";
	}
	cout << "\n\n";
	while (chift.s.empty == false)
	{
		k = chift.pop();
		cout << k << " ";
	}
	cout << "\n\n";
	return 0;
}

 

  • Автор

Реджеп Иведик

Госпожата иска да не въвеждаме библиотеки

ined

Това го разделя на два стека така ли, ако е така main как ще бъде. И как точно го разделя на два стека.

 

Редактирано от mitko9670 (преглед на промените)

Не съм въвел библиотеки. ctime е за функцията time(0); , която използвам за да захраня генератора на случайни числа, а cstdlib е за генератора за случайни числа.

И двете библиотеки са за контрол, дали е направена програмата правилно. Спокойно можеш, след като се убедиш, че работи, да ги изрежеш и да изрежеш функцията main() или да я промениш.

Кой курс си ?

Защо не ви казват елементарни неща ?

#include <iostream>

using namespace std;

struct node
{
	int data;
	node* previous;
	node* next;
};


struct spisak
{ 
	bool empty;
	node* head;
	node* tail;
	node* conductor;
	void pushback(int n);
	void pushfront(int n);
	spisak();
	~spisak();
	int popfront();
	int popback();
};


spisak::spisak()
{
	head = 0;
	tail = 0;
	conductor = 0;
	empty = true;
}

spisak::~spisak()
{
	node* monductor;
	conductor = head;
	while (conductor != 0)
	{
		monductor = conductor;
		conductor = conductor->next;
		delete monductor;
	}
}


void spisak::pushback(int n)
{
	node* pnode;
	pnode = new node;
	pnode->data = n;
	if (empty == true)
	{
		head = pnode;
		tail = pnode;
		pnode->previous = 0;
		pnode->next = 0;
		empty = false;
	}
	else
	{
		pnode->previous = tail;
		tail->next = pnode;
		tail = pnode;
		pnode->next = 0;
		empty = false;
	}
}


void spisak::pushfront(int n)
{
	node* pnode;
	pnode = new node;
	pnode->data = n;
	if (empty == true)
	{
		head = pnode;
		tail = pnode;
		pnode->previous = 0;
		pnode->next = 0;
		empty = false;
	}
	else
	{
		pnode->next = head;
		head->previous = pnode;
		head = pnode;
		pnode->previous = 0;
		empty = false;
	}
}


int spisak::popfront()
{
	int n;
	if (empty == true) return -1;
	n = head->data;
	conductor = head;
	head = head->next;
	delete conductor;
	if (head == 0)
	{
		tail = 0;
		empty = true;
	}
	return n;
}

int spisak::popback()
{
	int n;
	if (empty == true) return -1;
	n = tail->data;
	conductor = tail;
	tail = tail->previous;
	delete conductor;
	if (tail == 0)
	{
		head = 0;
		empty = true;
	}
	return n;
}

struct opashka
{
	spisak s;
	void push(int n);
	int pop();
};

void opashka::push(int n)
{
	s.pushfront(n);
}

int opashka::pop()
{
	if (s.empty == true) return -1;
	return s.popback();
}

struct stek
{
	spisak s;
	void push(int n);
	int pop();
};


void stek::push(int n)
{
	s.pushfront(n);
}

int stek::pop()
{
	if (s.empty == true) return -1;
	return s.popfront();
}

int main()
{
	int k;
	opashka pashka;
	stek tek, chift;
	for (;;)
	{
		cout << "vavedete cialo chislo, 0 za krai -> ";
		cin >> k;
		if (k == 0) break;
		pashka.push(k);
	}
	cout << "\n\n";
	for (;;)
	{
		if (pashka.s.empty == true) break;
		k = pashka.pop();
		if (k % 2) tek.push(k);
		else chift.push(k);
	}
	while (tek.s.empty == false)
	{
		k = tek.pop();
		cout << k << " ";
	}
	cout << "\n\n";
	while (chift.s.empty == false)
	{
		k = chift.pop();
		cout << k << " ";
	}
	cout << "\n\n";
	return 0;
}

 

Без <iostream> или <cstdio> не можеш ни да въведеш, ни да изведеш нищо.

Други хедъри не съм инклудвал, дано кандиса госпожата

  • Автор
 

Първи курс съм. Има още нещо да мене ми трябва само положителни числа тука като въведа отрицателно число пак го изкарва. И ако може да ми обясниш как работи как става самото разделяте от опашка в стек общо взето всичко. Като например това for(;;) какво е това и ~ тази знак на списък. Ако може ред по ред да ми я обясниш.

 

Редактирано от mitko9670 (преглед на промените)

Цитат

 Като например това for(;;) какво е това

Любимия на Реджеп Иведик безкраен цикъл с принудителен break :)

#include <iostream>    // хедър за вход и изход, синдицио конекванон
						// освен ако не ползваш операционната система или външни библиотеки
using namespace std; // стандартен неймспейс, за да може символите от <iostream>
					// да се ползват директно, без std:: преди тях
struct node          // помощен клас за въвеждане на елемент към двойно свързан списък
{
	int data;		// данни (самия елемент, в случая цяло число)
	node* previous; // указател към предходния клас записан в списъка
	node* next;		// указател към следващия клас записан в списъка
};


struct spisak		// клас списък
{ 
	bool empty; // флаг за проверка дали списъка е празен
	node* head; // указател към началото на списъка
	node* tail; // указател към края на списъка
	node* conductor; // помощен указател
	void pushback(int n); // метод за въвеждане на елемент в края (дефиниран отвън класа)
	void pushfront(int n); // ––""–– в началото (дефиниран отвън класа)
	spisak(); // конструктор, необходимо е empty да се инициализира с true
	~spisak(); // деструктор, за да може правилно да се разруши обекта
	int popfront(); // метод за извличане на елемент от началото на списъка (дефиниран отвън)
	int popback();  // метод за извличане на елемент от края на списъка (дефиниран отвън)
};


spisak::spisak() // дефиниция на конструктора на класа списък
{
	head = 0;
	tail = 0;
	conductor = 0;
	empty = true;
}

spisak::~spisak()  // дефиниция на деструктора на класа списък
{
	node* monductor;
	conductor = head;
	while (conductor != 0)
	{
		monductor = conductor;
		conductor = conductor->next;
		delete monductor;
	}
}


void spisak::pushback(int n) // дефиниция на въвеждане на елемент в края
{
	node* pnode;      // указател към клас елемент
	pnode = new node; // заделяне на динамична памет за елемента
	pnode->data = n;  // въвеждане в класа елемент, на данните, които са указани като параметър
	if (empty == true) // проверка дали списъка е празен
	{				   // действия ако е празен
		head = pnode;  // главата и опашката се насочват към въвеждания елемент
		tail = pnode;
		pnode->previous = 0; // указателите предишен и следващ се нулират
		pnode->next = 0;
		empty = false;   // на флага за празнота се присвоява стойност "лъжа"
	}
	else
	{                          // действия ако не е празен
		pnode->previous = tail; // указателя предишен се насочва към опашката
		tail->next = pnode;     // указателя следващ на елемента към който сочи опашката се насочва към настоящия елемент
		tail = pnode;          // опашката се насочва към настоящия елемент
		pnode->next = 0;       // указателя следващ на настоящия елемент се нулира
		empty = false;    // на флага за празнота се присвоява стойност "лъжа"
	}
}


void spisak::pushfront(int n) // дефиниране на метода за въвеждане отпред
{
	node* pnode;             // като горния метод, но глава и опашка и предишен и следващ са разменени
	pnode = new node;
	pnode->data = n;
	if (empty == true)
	{
		head = pnode;
		tail = pnode;
		pnode->previous = 0;
		pnode->next = 0;
		empty = false;
	}
	else
	{
		pnode->next = head;
		head->previous = pnode;
		head = pnode;
		pnode->previous = 0;
		empty = false;
	}
}


int spisak::popfront()  // метод за извличане на елемент от началото
{
	int n;                        // място за извлечения елемент
	if (empty == true) return -1; // ако списъка е празен връща -1 ( ако empty == false -1 е извлечена стойност)
	n = head->data;     // извличат се данните от началния елемент
	conductor = head;   // помощния указател се насочва към началния елемент
	head = head->next; // главата се насочва към втория елемент
	delete conductor;  // началния елемент се изтрива чрез помощния указател
	if (head == 0)
	{
		tail = 0;       // ако списъка се е опразнил се инициализира подобаващо
		empty = true;
	}
	return n;
}

int spisak::popback()   // метод за извличане от края
{
	int n;                        // подобно на метода за извличане от началото, но обърнато обратно
	if (empty == true) return -1;
	n = tail->data;
	conductor = tail;
	tail = tail->previous;
	delete conductor;
	if (tail == 0)
	{
		head = 0;
		empty = true;
	}
	return n;
}

struct opashka // клас опашка
{
	spisak s;  // състои се от списък и методи за въвеждане и извеждане
	void push(int n);
	int pop();
};

void opashka::push(int n)
{                             // тук е ясно
	s.pushfront(n);
}

int opashka::pop()
{
	if (s.empty == true) return -1; // тук също, но първо се прави проверка дали е празен
	return s.popback();
}

struct stek
{                 // също като опашка, ама стек, фръст ин ласт аут, ласт ин фръст аут
	spisak s;     // първите паднаха в кърви, последните станаха първи
	void push(int n);
	int pop();
};


void stek::push(int n)
{
	s.pushfront(n);        //също като за опашка, ама за стек
}

int stek::pop()
{
	if (s.empty == true) return -1;  // и тука
	return s.popfront();
}

int main()
{
	int k;
	opashka pashka;  // деклариране на два стека, една опашка и едно цяло число
	stek tek, chift;
	for (;;)
	{
		cout << "vavedete cialo chislo, 0 za krai -> ";  
		cin >> k;             // въвеждане на тестващи числа
		if (k == 0) break; // с нула се прекратява
		pashka.push(k);
	}
	cout << "\n\n";
	for (;;)
	{
		if (pashka.s.empty == true) break;
		k = pashka.pop();                     // извличане от опашката и въвеждане в 
		if (k % 2) tek.push(k);             //съответния стек
		else chift.push(k);
	}
	while (tek.s.empty == false)
	{
		k = tek.pop();                 // нечетните извлича от стек тек
		cout << k << " ";
	}
	cout << "\n\n";
	while (chift.s.empty == false)
	{
		k = chift.pop();                   // четните извлича от стек чифт
		cout << k << " ";
	}
	cout << "\n\n";
	return 0;
}

 

  • Автор

Ясно само не разбрах това какво прави и ти използваш списъци не може ли да се направи без списък само с опашка и стек.

for (;;)

Редактирано от mitko9670 (преглед на промените)

Може и без списъци, ама все едно, така или иначе, трябва да се използва някаква структура. Ако не е списък, може да е вектор или масив. Но вектор е в библиотеката, а тя е забранена. Значи масив.

Стека се прави много лесно с масив. Определяш еднолично, къде ще е дъното и къде ще е върха на стека. Указателя сочи дъното при празен стек. А със запълването се издига към върха. Смисълът на структурата стек е логиката "първи влязъл, последен излязъл". Това е логиката на купчината, оттам и наименованието "стек".

Опашка, чрез масив се постига с два указателя. Не е лошо логиката на обхождане на масива да е такава, щото след последния елемент на масива да следва отново първия, като по този начин се реализира един вид кръг, а елементите, поради специфичната логика на структурата опашка се въртят в този кръг, като по този начин се постига по лесно първия влязъл да е първи излязъл. Логиката е като при опашка в магазин. Който първи се нареди, първи си купува. За това се нарича опашка. Кю на английски.

Мога. Чичо ти Реджеп го е измислил програмирането, но като гледам кода, който си постнал, ти също се опитваш да направиш опашка чрез използване на свързан списък.

Сега ако я направя с масиви, пак няма да си доволен, щото явно ви я искат не с масив, а със списък, но ти не можеш може би да направиш разлика, кое какво е.

#include <stdio.h>

int opashka[2000];
int beginopashka = 0;
int endopashka = 0;
int sizeopashka = 0;
int stek[1000];
int ustek = 0;
int schift[1000];
int uschift = 0;

int pushopashka(int n)
{
	if (sizeopashka >= 2000) return -1;
	if (sizeopashka == 0)
	{
		opashka[0] = n;
		beginopashka = 0;
		endopashka = 0;
		sizeopashka = 1;
		return 0;
	}
	endopashka = (endopashka + 1) % 2000;
	opashka[endopashka] = n;
	sizeopashka++;
	return 0;
}

int popopashka(bool* flag)
{
	int n;
	if (sizeopashka == 0)
	{
		*flag = false;
		return -1;
	}
	*flag = true;
	n = opashka[beginopashka];
	beginopashka = (beginopashka + 1) % 2000;
	sizeopashka--;
	return n;
}

int pushstekchift(int* kupchina, int totalsize, int* ukazatel, int n)
{
	if (*ukazatel >= totalsize - 1) return -1;
	kupchina[*ukazatel] = n;
	(*ukazatel)++;
	return 0;
}

int popstekchift(int* kupchina, int totalsize, int* ukazatel, bool* flag)
{
	if (*ukazatel == 0)
	{
		*flag = false;
		return -1;
	}
	(*ukazatel)--;
	*flag = true;
	return kupchina[*ukazatel];
}


int main()
{
	bool flag;
	int k;
	for (;;)
	{
		printf("\nvavedete chislo, nula za kraj -> ");
		scanf("%d", &k);
		if (k == 0) break;
		if (k < 0)
		{
			printf("\n\nnou si pros");
			return 0;
		}
		if (pushopashka(k) == -1)
		{
			printf("\n\nprepalni se opashkata bre !!!");
			return 0;
		}
	}
	for (;;)
	{
		k = popopashka(&flag);
		if (!flag) break;
		if (k % 2)
		{
			if (pushstekchift(stek, 1000, &ustek, k) == -1)
			{
				printf("prepalni se steka bre !!!");
				return 0;
			}
		}
		else
		{
			if (pushstekchift(schift, 1000, &uschift, k) == -1)
			{
				printf("prepalni se steka bre !!!");
				return 0;
			}
		}
	}
	printf("\n");
	for (;;)
	{
		k = popstekchift(stek, 1000, &ustek, &flag);
		if (flag == false) break;
		printf("%d ", k);
	}
	printf("\n\n");
	for (;;)
	{
		k = popstekchift(schift, 1000, &uschift, &flag);
		if (flag == false) break;
		printf("%d ", k);
	}
	printf("\n\n");
	return 0;
}

 

Абе ти колко още ще мешаш C и C++ и ще пускаш безкрайни цикли? Безкрайните цикли са табу в програмирането.

Безкрайните цикли са безкрайни цикли и не са безкрайни цикли, но и това е вярно и не е вярно. Не съм чул някой да е отменил средния път, още откакто Буда завъртя колелото на закона !!!

преди 4 часа, Реджеп Иведик написа:

Мога. Чичо ти Реджеп го е измислил програмирането, но като гледам кода, който си постнал, ти също се опитваш да направиш опашка чрез използване на свързан списък.

Сега ако я направя с масиви, пак няма да си доволен, щото явно ви я искат не с масив, а със списък, но ти не можеш може би да направиш разлика, кое какво е.

Автора на темата е спал в часа и/или нищо не му е ясно по темата, 100% даскалицата му ще ги иска опашката и стека реализирани като списък след като не ги иска от STL-a 

  • Автор

ined-тя не ни е казала да използваме или да не използваме списък, но според мене е така, защото още не сме вземали списък и затова предполагам, че би трябвало да не се използва списъка.

преди 12 минути, mitko9670 написа:

ined-тя не ни е казала да използваме или да не използваме списък, но според мене е така, защото още не сме вземали списък и затова предполагам, че би трябвало да не се използва списъка.

Казала или неказала няма значение, структура от навързани елементи като тези които си написал в началото е списък. 

Редактирано от ined (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.