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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Задача със стек(c++)

Featured Replies

Здравейте! Бихте ли ми помогнали със следната задача: Съставете програма, която създава стек, след което установява 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;
}

 

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

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

 

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

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

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

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

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

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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