Ошибка В Решении

  • Автор темы Whatka
  • Дата начала
W

Whatka

#1
Найти колличество элементов стека с одинаковыми "соседями"
Вот моё решение ошибок не выдаёт,но ответ не верный(всегда 0):
C++:
#include <iostream>
using namespace std;
class Stack
{
struct stack
{
int elem;
stack *p;
};
stack *head;
public:
Stack(){head=NULL;}						//Конструктор
~Stack()								//Деструктор
{
stack *New;
New=head;
while(head)
{
New=head;
head=head->p;
delete New;
}
}
void push(int a)						//Добавить в начало стека передаваемое число
{
stack *New;
New=new stack;
New->p=head;
New->elem=a;
head=New;	
}
int pop()								//Извлечь из начала стека (с удалением)
{
int back;
stack *New;
New=head;
head=head->p;
back=head->elem;
delete New;
return back;
}
bool is_empty()							//Проверка пуст ли стек
{
bool a=false;
if (head==NULL)
a=true;
return a;	
}
void print ()							//Печать содержимого стека
{
stack *New;
New=head;
while(New)
{
cout<<New->elem<<endl;
New=New->p;
}
}
};
void main()
{
setlocale(LC_ALL,"RUS");
Stack w;
int n,a,in,s(0);
metka:
cout<<"Количество элементов стека:";
cin>>n;
if(n<=2)
{
system ("cls");
cout<<"Не корректное значение!\n";
goto metka;
}
cout<<"Введите интервал заполнения:";
cin>>in;
cout<<"Стек после заполнения случайными числами:\n";
for(int i(0);i<n;i++)
{
a=rand()%in;
w.push(a);
}
w.print();
int e1,e2,e3;
e1=w.pop();
e2=w.pop();
while(w.is_empty()!=NULL)
{
e3=w.pop();
if(e1==e3)
s++;
e1=e2;
e2=e3;
}
cout<<"Количество чисел стека с одинаковыми соседями:"<<s<<endl;
}
 
R

rrrFer

#2
while(w.is_empty()!=NULL)
точно должно быть ==, но я бы ваще это выпилил, алгоритм странный. После вычисления количества элементов, удовлетворяющих...стек очищается, что уже само по себе криво.
Чето мне функция pop не нравится. Остальное не смотрел, т.к. код вцелом кривой и отформатирован стремно.
 
W

Whatka

#3
стек очищается, что уже само по себе криво.
я не согласен с этим аргументом
Чето мне функция pop не нравится.
что именно не нравится?что не так?
Остальное не смотрел, т.к. код вцелом кривой и отформатирован стремно.
конечно у каждого своя точка зрения
но хотелось бы конкретных замечаний и предложений
 
W

Whatka

#4
всё нашёл ошибку
в цикле ==
и в функции pop
сначала строка
back=head->elem;
а потом
head=head->p;
 
R

rrrFer

#5
стек очищается, что уже само по себе криво.
я не согласен с этим аргументом
Стек не должен очищаться ни при добавлении элемента, ни при проверки на пустоту. Точно также он не должен очищаться и при подсчете количества элементов, имеющих одинаковых соседей. Для освобождения памяти существует деструктор.
но хотелось бы конкретных замечаний и предложений
Код:
Stack w;
int n,a,in,s(0);
название переменной должно о чем-то говорить программисту.
Код:
void print ()							//Печать содержимого стека
{
stack *New;
New=head;
в функции добавления узла имя переменной New сойдет, но у вас такое имя используется везде, и при удалении узла, и в деструкторе и везде )
Код:
 if (head==NULL)
while(w.is_empty()!=NULL)
почему NULL, а не 0? - Страуструп рекомендовал не использовать NULL без особой необходимости.
По форматированию кода что не понятно?(ну МБ при публикации кода на форуме форматирование испортилось, но на кодебае не замечал таких артефактов.

По алгоритму, ИМХО конешно, лучше проверять как то так:
Код:
if( element ->data == element ->next ->next ->data )
//обязательно нужны проверка что ->next ->next существует вообще.
чем после каждой итерации выполнять это:
Код:
e1=e2;
e2=e3;
Ну МБ я тут неправ.