Получилось только просто сделать классический стек.
#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;
}
Используя дополнительный стек, это можно сделать следующим образом.
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.
Все что остается сделать, это перенести из вспомогательного стека обратно в основной.
Этот вариант решения является неоптимальный(но рабочий), так как приходится использовать вспомогательный стек. Можно обойтись без вспомогательного стека.
Без использование дополнительного стека
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 - значит родителя удаляем.У текущего элемента изменяем родителя на следующий элемент после удаляемого.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Имеется ли в с++ готовая функция которая бы могла попытаться преобразовать строку в число (double к примеру), и при неудаче возвращала бы не ноль,...
подскажите пожалуйста у меня в переменной int res не приводит к целому значению