Распечатать возрастающие серии последовательности в обратном порядке - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы