Премини към съдържанието
15 години Kaldata.com – време е да почерпим! Прочети още... ×

Препоръчан отговор


Здравейте! Бихте ли ми помогнали със следната задача: Съставете програма, която създава стек, след което установява N - я след върха елемент в стойност A, като първите N-1 елемента запазват своите стойности. Стекът трябва да е динамичен и да не се имплементира като масив. Условието ми се струва неясно, но ето как мисля, че трябва да стане:

1.Установява N - я след върха елемент в стойност A

stek1.PNG

2. Първите N-1 елемента запазват своите стойности

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

Така, прехвърлят се първите N-1 елемента, които запазват своите стойности в нов стек, само че така ще излязат на обратно 20,10 затова трябва да се прехвърлят в още един стек, който изглежда така:

stek2.PNG

Числата са примерни. Сигурен съм, че във финалния стек 40 не трябва да присъства защото е N+1 елемент.

Само, че не мога да реализирам идеята. Засега имам само функции за добавяне и извличане на елементи, тоест нищо.

#include <iostream>
using namespace std;

void push(int n);
int pop(int &n);

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

*start=NULL,*p;

void push(int n)
{
    p=start;
    start=new elem;
    start->key=n;
    start->next=p;
}

int pop(int &n)
{
    if(start)
    {
        n=start->key;
        p=start;
        start=start->next;
        delete p;
        return 1;
    }
    else
        return 0;
}
void main()
{
    int num;
    cout<<"Vuvedete chisla:";
    while(cin>>num)
    {push(num);}
    cout<<"\n Stack:   ";
    while(pop(num))
        {cout<<num<<"   " ;}
    getche();

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

преди 1 час, asd345 написа:

Здравейте! Бихте ли ми помогнали със следната задача: Съставете програма, която създава стек, след което установява N - я след върха елемент в стойност A, като първите N-1 елемента запазват своите стойности. Стекът трябва да е динамичен и да не се имплементира като масив. Условието ми се струва неясно, но ето как мисля, че трябва да стане:

1.Установява N - я след върха елемент в стойност A

stek1.PNG

2. Първите N-1 елемента запазват своите стойности

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

Така, прехвърлят се първите N-1 елемента, които запазват своите стойности в нов стек, само че така ще излязат на обратно 20,10 затова трябва да се прехвърлят в още един стек, който изглежда така:

stek2.PNG

Числата са примерни. Сигурен съм, че във финалния стек 40 не трябва да присъства защото е N+1 елемент.

Само, че не мога да реализирам идеята. Засега имам само функции за добавяне и извличане на елементи, тоест нищо.


#include <iostream>
using namespace std;

void push(int n);
int pop(int &n);

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

*start=NULL,*p;

void push(int n)
{
    p=start;
    start=new elem;
    start->key=n;
    start->next=p;
}

int pop(int &n)
{
    if(start)
    {
        n=start->key;
        p=start;
        start=start->next;
        delete p;
        return 1;
    }
    else
        return 0;
}
void main()
{
    int num;
    cout<<"Vuvedete chisla:";
    while(cin>>num)
    {push(num);}
    cout<<"\n Stack:   ";
    while(pop(num))
        {cout<<num<<"   " ;}
    getche();

}

Опитай се да изясниш какво е условието на задачата.

До колкото разбирам имаш даден стек с произволен брой елементи и трябва да напишеш функция, която редактира даден елемент в стека, така ли е?

Ти си дал стек 10 20 30 40.
Ако А=60, тогава стека трябва да изглежда 10 20 60 40 (в текущия пример), така ли?

Ако е така, ето примерен алгоритъм:

1. Задели памет за нов стек, който ще съдържа броя елементи от желания за редакция (без да броим него) до текущия връх(като броим него).

2, Тогава извади всички елементи от желания за редакция (без него) до върха на стека (включително) и ги постави в стека, за който писах в точка 1.

3. Тогава елемента, който искаш да редактираш ще е на върха на първоначалния стек.

4. Редактираш го.

5. Връщаш елементите от стека ,от точка 1, в първоначалния стек и освобождаваш заделената памет за стека от точка 1.

 

Към какъв тип данни сочат указателите, които си дефинирал точно преди дефиницията на функцията push(int n)?

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
Цитат

Ти си дал стек 10 20 30 40.
Ако А=60, тогава стека трябва да изглежда 10 20 60 40 (в текущия пример), така ли?

Ами, май не е така. Това условие ме обърква. Последният елемент, който си дал - 40 в случая се явява след A, тоест N+1 елемент. А условието е  "първите N-1 елемента запазват своите стойности". Или ти имаш предвид как ще изглежда вторият стек?

Цитат

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

Тоест трябва да имам три функции, които работят с различни стекове?

Струва ми се доста трудно, още повече, че указателите ми са пълна мъгла.

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 часа, asd345 написа:

Тоест трябва да имам три функции, които работят с различни стекове?

Струва ми се доста трудно, още повече, че указателите ми са пълна мъгла.

В момента както са написани трябва да имаш един комплект функции за стека с начало start и още едни за спомагателния.

Ако функциите ти не са привързани към конкретен указател, а го получават като праметър, едни и същи фунции ще можеш да използваш с колкото си искаш стекове. примерно push() ще е:

void push(elem* &stack, int n)
{
    elem *p=new elem;
    p->key=n;
    p->next=stack;
    stack=p;
}

 

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
#include <iostream>
using namespace std;

class node
{
public:
	int data;
	node* next;
};

class stack
{
public:
	node* first;
	void push(int mint);
	int top();
	void pop();
	bool set_nth_element(int n, int newdata);
	bool isempty();
	stack();
	~stack();
}pocket;

stack::stack()
{
	first = 0;
}

bool stack::isempty()
{
	if (first == 0) return true;
	return false;
}

void stack::push(int mint)
{
	node *temp, *memp;
	temp = new node;
	temp->data = mint;
	if (isempty())
	{
		first = temp;
		first->next = 0;
		return;
	}
	memp = first;
	first = temp;
	first->next = memp;
}

int stack::top()
{
	return first->data;
}

void stack::pop()
{
	node* temp;
	if (isempty()) return;
	temp = first;
	first = first->next;
	delete temp;
}

stack::~stack()
{
	node* temp;
	while (!isempty())
	{
		temp = first;
		first = first->next;
		delete temp;
	}
}

bool stack::set_nth_element(int n, int newdata)
{
	int i;
	pocket.~pocket();
	for (i = 0; i < n; i++)
	{
		if (isempty()) return false;
		pocket.push((*this).top());
		(*this).pop();
	}
	this->push(newdata);
	pocket.pop();
	while (!pocket.isempty())
	{
		this->push(pocket.top());
		pocket.pop();
	}
	return true;
}




int main()
{
	stack tatatak;
	int i;
	for (i = 1; i < 11; i++)
	{
		tatatak.push(i);
	}
	tatatak.set_nth_element(5, 101); // the nth element is 6, and will be replaced with 101
	while (!tatatak.isempty())
	{
		cout << tatatak.top() << " ";
		tatatak.pop();
	}
	return 0;
}

Петия елемент е 6, а не 5. 10 9 8 7 6 и 5 прави 11, следователно 10 = 11, дето имаше на времето през комунизма едн а детска вързанка

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
Цитат

Петия елемент е 6, а не 5. 10 9 8 7 6 и 5 прави 11, следователно 10 = 11, дето имаше на времето през комунизма едн а детска вързанка

  •  

Като цяло почти нищо не ми ясно в кода ти, а и не съм работил с класове.:D Но както и да е. А, всъщност какво прави програмата - замества произволен елемент в стека? Но защо извежда стек с 10 числа?

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

За онагледяване. Всъщност решението е в метода

bool stack::set_nth_element(int n, int newdata)
{
	int i;
	pocket.~pocket();
	for (i = 0; i < n; i++)
	{
		if (isempty()) return false;
		pocket.push((*this).top());
		(*this).pop();
	}
	this->push(newdata);
	pocket.pop();
	while (!pocket.isempty())
	{
		this->push(pocket.top());
		pocket.pop();
	}
	return true;
}

 

Покет е помощен стек, инстанцииран заедно с дефиницията на класа стек. 

Ц++ без класове е таратор без краставици и кисело мляко. На времето са го наричали Ц с класове. Значи става Ц с класове без класове. Дзенско.

 

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

Деструктора по подразбиране трябва да се скрие не заради покет, а заради другите стекове, които ще се декларират, защото е необходимо специално триене, което служебния деструктор не е способен да направи и ще се получи мемори ликидж

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.