Вывести элементы стека кратные 3

223
16 мая 2018, 20:50

Получилось только просто сделать классический стек.

#include <iostream> 
using namespace std;
struct Node
{
 int d;
 Node *p;
};
Node * first(int d);
void push(Node **top, int d);
int pop(Node **top);
void main()
{
 Node* top = first(1);
 for (int i = 2; i<6; i++) push(&top, i);
 while (top) 
   cout << pop(&top) << " ";
}

Node * first(int d)
{
 Node *pv = new Node;
 pv->d = d;
 pv->p = 0;
 return pv;
}

void push(Node **top, int d)
{
 Node *pv = new Node;
 pv->d = d;
 pv->p = *top;
 *top = pv;
}
int pop (Node **top)
{
 int temp = (*top)->d;
 Node *pv = *top;
 *top = (*top)->p;
 delete pv; 
 return temp;
}
Answer 1
  1. Используя дополнительный стек, это можно сделать следующим образом.

    void main()
    {
       Node* top = first(1);
       for (int i = 2; i<20; i++) 
          push(&top, i);
       Node * top2 = nullptr;
       while (top)
       {
           int d = pop(&top);
           if (d % 3)
              push(&top2, d);
       }
       while (top2)
       {
           push(&top, pop(&top2));
       }
       // вывод результирующего массива(он не содержит элементов, кратных 3)
       while (top)
           cout << pop(&top) << " ";
    }

Суть работы: читаем из первого стека, и добавляем в другой стек только те элементы, которые не кратны 3. В результате во вспомогательном стеке останутся только элементы, не кратные 3.
Все что остается сделать, это перенести из вспомогательного стека обратно в основной.

Этот вариант решения является неоптимальный(но рабочий), так как приходится использовать вспомогательный стек. Можно обойтись без вспомогательного стека.

  1. Без использование дополнительного стека

    void main()
    {
        Node* top = first(1);
        for (int i = 2; i<20; i++) 
            push(&top, i);
        while (top && top->d % 3 == 0)
           pop(&top);
        Node *els = top;
        while (els)
        {
           if (els->p && els->p->d % 3 == 0)
           {
               Node* remove = els->p;
               els->p = els->p->p;
               delete remove;
           }
           els = els->p;
        }
        while (top)
            cout << pop(&top) << " ";
      }

Суть работы:
а)сначала удаляем верхний элемент стека, если он кратен 3. Это нужно для того, чтобы получить актуальную голову после возможного удаления.
б) имея актуальную голову после удаления, далее бежим по стеку вниз и смотрим, если для родителя текущего элемента элемент кратен 3 - значит родителя удаляем.У текущего элемента изменяем родителя на следующий элемент после удаляемого.

READ ALSO
Умные указатели C++

Умные указатели C++

Есть такой код:

220
Как перевести строку в число

Как перевести строку в число

Имеется ли в с++ готовая функция которая бы могла попытаться преобразовать строку в число (double к примеру), и при неудаче возвращала бы не ноль,...

228
не переводит в переменную

не переводит в переменную

подскажите пожалуйста у меня в переменной int res не приводит к целому значению

239
Обертка над boost::signals

Обертка над boost::signals

Недавно начал изучать boostОбратил внимание на сигналы/слоты

236