Распечатать возрастающие серии последовательности в обратном порядке - C (СИ)
Формулировка задачи:
Пусть дана последовательность целых чисел. Распечатать возрастающие серии последовательности в обратном порядке. Серия - это упорядоченна последовательность последовательность максимальной длины. Стек реализовать с использованием динамического распределение памяти.
Решение задачи: «Распечатать возрастающие серии последовательности в обратном порядке»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Узел
typedef struct _TNode
{
int value; // Само значение узла
struct _TNode* next; // Указатель на следующий узел
} TNode;
//-----------------------------------------------------------------------------
// Функция добавления элемента в стек
// Принимает в качестве параметров адрес указателя на стек и само значение
// Возвращает указатель на вершину стека
TNode* Push(TNode** stack, int value)
{
// Выделяем память под новый узел
TNode* node = malloc(sizeof(TNode));
// Присваиваем новому узлу переданное значение
node->value = value;
// Задаём в качестве следующего узла нынешнюю вершины
node->next = *stack;
// Делаем созданный узел вершиною стека
*stack = node;
// Возвращаем вершину стека
return *stack;
}
//-----------------------------------------------------------------------------
// Функция извлекает из стека верхний элемент
// Принимает в качестве параметра адрес указателя на стек
// Возвращает значение извлекаемого элемента
int Pop(TNode** stack)
{
// Дублируем указатель на вершину стека
TNode* node = *stack;
// Сохраняем значение удаляемой вершины
int value = node->value;
// Перемещаем вершину стека на уровень ниже
*stack = node->next;
// Удаляем извлекаемый элемент
free(node);
// Возвращаем значение извлекаемого элемента
return value;
}
//-----------------------------------------------------------------------------
// Функция удаляет все элементы стека
// Принимает в качестве параметра адрес указателя на стек
void Clear(TNode** stack)
{
// Пока присутствует хоть один элемент в стеке
while (*stack)
{
// Извлекаем элемент из стека
Pop(stack);
}
}
//-----------------------------------------------------------------------------
// Функция выводит на дисплей все элементы стека
void Print(const TNode* stack)
{
// Перебираем все элементы стека
for (; stack; stack = stack->next)
{
// Выводим на экран значение очередного элемента
printf("%d ", stack->value);
}
printf("\n");
}
//-----------------------------------------------------------------------------
// Функция печатает серии стека
// Принимает в качестве параметра указатель на стек
void PrintSeries(const TNode* stack)
{
// Вспомогательная переменная в которой будут хранится серии
TNode* series = NULL;
// Вспомогательная переменная отвечающая за логическое утверждение
// добавляется ли элемент во вспомогательный стек, или выводится на экран
// очередная серия
int pushed;
// Пока не достигнут конец стека
while (stack)
{
pushed = ((series == NULL) || (series->value <= stack->value));
// Если вспомогательный стек пуст или правило серии выполняется, тогда
if (pushed)
{
// Добавляем очередной элемент во вспомогательный стек
Push(&series, stack->value);
// Переходим к следующему элементу стека
stack = stack->next;
}
//Если добавление не было произведено или достигнут конец
// басового стека
if (!pushed || stack == NULL)
{
// Выводим содержимое вспомогательного стека
Print(series);
// Удаляем все элементы вспомогательного стека
Clear(&series);
}
}
}
//-----------------------------------------------------------------------------
// А вот тут, я думаю, вообще ничего не нужно комментировать
// и так всё понятно.
int main()
{
TNode* stack = NULL;
int i = 15;
srand(time(NULL));
while (i--)
{
Push(&stack, rand() % 10);
}
Print(stack);
printf("\n");
PrintSeries(stack);
return 0;
}