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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Стек ,проблем с извеждане

Featured Replies

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

Та ето го условието: 

Да се създаде свързан списък от естествени числа до въвеждането на 0, чрез добавяне в края. Готовият списък да се иведе на екрана. Да се въведе от клавиатура та цяло число Х и всички елементи на списъка , по-големи от  Х , да се запишат в стек. Да се прочетат елементите на стека и да се изведат на екрана.

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

#include <iostream>
 
using namespace std;
 
struct List {
	int x;
	List *next;
};
void Spush(List *& top, int i) {
	List *p = new List;
	p->x = i;
	p->next = top;
	top = p;
}
 
List * Spop(List *& top) {
	if (top == NULL) return top;
	List *p = top;
	top = top->next;
	return p;
}
 
void AddEnd(List *& first, List *& last, int i) {
	List *p = new List;
	p->x = i;
	p->next = NULL;
	if (first == NULL) first = last = p;
	else {
	  last->next=p;
	  last=p;
	}
}
 
void PrintList(List * first) {
	List *p = first;
	while (p != NULL) {
	  std::cout << p->x << " ";
	  p = p->next;
	}
	std::cout << std::endl;
}
 
 
 
 
 
int main()
{
 
    int y;
    cin>>y;
 
   List *first=NULL,*st,*last;
   st=NULL;
    List *p=first;
 
 
while(y!=0){
    AddEnd(first,last,y);
      cin>>y;
}
PrintList(first);
// Тази част работи до тук
 
st=NULL;
 
int X;
cin>>X;
if(X>=0){
 
 
while (p!=NULL){
if (p->x>X) {
    Spush (st,p->x);
    p=p->next;
 
}
}
}
else
    cout<< "X is less that 0";
while ((p=Spop(st))!=NULL){
    cout <<p->x<<" ";
    delete p;
 
}
//Елементите не се извеждат, без никакви грешки
cout<<endl;
}
 

 

На практика никъде не добавяш елемeнтите към стека.

Самото извеждане може да го правиш и с PrintList(st), но може и да вадиш елементи с Spop() докато се изпразни стека,

само че начина по който реализиран Spop изобщо не е удобен за ползване

позволих си да ти коригирам малко програмата:

#include <iostream>
 
using namespace std;
 
struct List {
	int x;
	List *next;
};
void Spush(List *& top, int i) {
	List *p = new List;
	p->x = i;
	p->next = top;
	top = p;
}

int Spop(List *& top) 
{
	if (top == NULL) return 0;
	int n = top->x;
	List *p=top;
	top = top->next;
	delete p;
	return n;
}
 
void AddEnd(List *& first, List *& last, int i) {
	List *p = new List;
	p->x = i;
	p->next = NULL;
	if (first == NULL) first = last = p;
	else {
	  last->next=p;
	  last=p;
	}
}
 
void PrintList(List * first) {
	List *p = first;
	while (p != NULL) {
	  std::cout << p->x << " ";
	  p = p->next;
	}
	std::cout << std::endl;
}
 
 
 
 
 
int main()
{
 
    int y;
    cin>>y;
 
   List *first=NULL,*st,*last;
   st=NULL;
    List *p=first;
 
 
while(y!=0){
    AddEnd(first,last,y);
      cin>>y;
}
PrintList(first);
 
st=NULL;
 
int X;
cin>>X;
p=first;
if(X>=0)
{
   while (p)
   {
       if (p->x>X) Spush (st,p->x);
       p=p->next; 
   }
}
else
    cout<< "X is less that 0";
PrintList(st);   // извеждане  на стека  като списък
cout<<endl;
while (st) cout<<Spop(st)<<" ";
cout<<endl;
}

 

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

  • Автор

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

#include <iostream>
#include <climits>
using namespace std;

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

struct list
{
	int size;
	node* head;
	node* tail;
	node* conductor1;
	node* conductor2;
	list();
	void push_back(int n);
	void push_front(int n);
	~list();
};

list::list()
{
	size = 0;
	head = new node;
	tail = new node;
	head->next = tail;
	tail->next = head;
}

void list::push_front(int n)
{
	conductor1 = new node;
	conductor1->data = n;
	conductor1->next = head->next;
	head->next = conductor1;
	size++;
}

void list::push_back(int n)
{
	conductor1 = new node;
	conductor1->data = n;
	conductor1->next = tail;
	tail->next->next = conductor1;
	tail->next = conductor1;
	size++;
}



list::~list()
{
	if (head != 0)
	{
		conductor2 = head->next;
		conductor1 = head;
	}
	else return;
	while (conductor2 != tail)
	{
		conductor1 = conductor2;
		conductor2 = conductor2->next;
		delete conductor1;
	}
	delete head;
	delete tail;
}

struct stack :list
{
	int top();
	int pop();
	void push(int n);
	~stack();
};

int stack::top()
{
	if (size != 0) return head->next->data;
	else return INT_MIN;
}

int stack::pop()
{
	int answer;
	if (size != 0) answer = head->next->data;
	else return INT_MIN;
	conductor1 = head->next;
	head->next = head->next->next;
	delete conductor1;
	size--;
	return answer;
}

void stack::push(int n)
{
	push_front(n);
}

stack::~stack()
{
	while (size != 0)
	{
		pop();
	}
	delete head;
	delete tail;
	head = 0;
	tail = 0;
}


int main()
{
	list container;
	stack lifo;
	int n;
	cin >> n;
	while (n != 0)
	{
		container.push_back(n);
		cin >> n;
	}
	int x;
	cin >> x;
	container.conductor1 = container.head->next;
	while (container.conductor1 != container.tail)
	{
		if (x < container.conductor1->data)
		{
			lifo.push(container.conductor1->data);
		}
		container.conductor1 = container.conductor1->next;
	}
	while (lifo.size > 0)
	{
		cout << lifo.top() << endl;
		lifo.pop();
	}
    return 0;
}

 

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

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

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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