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

Тема в разделе "C/C++/C#", создана пользователем Whatka, 9 мар 2012.

  1. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    Найти колличество элементов стека с одинаковыми "соседями"
    Вот моё решение ошибок не выдаёт,но ответ не верный(всегда 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;
    }
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    while(w.is_empty()!=NULL)
    точно должно быть ==, но я бы ваще это выпилил, алгоритм странный. После вычисления количества элементов, удовлетворяющих...стек очищается, что уже само по себе криво.
    Чето мне функция pop не нравится. Остальное не смотрел, т.к. код вцелом кривой и отформатирован стремно.
     
  3. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    я не согласен с этим аргументом
    что именно не нравится?что не так?
    конечно у каждого своя точка зрения
    но хотелось бы конкретных замечаний и предложений
     
  4. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    всё нашёл ошибку
    в цикле ==
    и в функции pop
    сначала строка
    back=head->elem;
    а потом
    head=head->p;
     
  5. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Стек не должен очищаться ни при добавлении элемента, ни при проверки на пустоту. Точно также он не должен очищаться и при подсчете количества элементов, имеющих одинаковых соседей. Для освобождения памяти существует деструктор.
    название переменной должно о чем-то говорить программисту.
    в функции добавления узла имя переменной New сойдет, но у вас такое имя используется везде, и при удалении узла, и в деструкторе и везде )
    почему NULL, а не 0? - Страуструп рекомендовал не использовать NULL без особой необходимости.
    По форматированию кода что не понятно?(ну МБ при публикации кода на форуме форматирование испортилось, но на кодебае не замечал таких артефактов.

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

Поделиться этой страницей