Преобразовать стек в два стека - C (СИ) (77161)

Узнай цену своей работы

Формулировка задачи:

Нужно создать стек в диапазоне -50 до 50.Преобразовать стек в два стека.Причем, первый должен содержать только положительные числа,второй - только отрицательные. Ни разу не работала со стеками,помогите пожалуйста разобраться)) Мне много не надо))

Решение задачи: «Преобразовать стек в два стека»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* Макрос возвращает случайное число х такое, что l <= x <= h */
#define bounded_random(l, h) ( rand() % ((h) - (l) + 1) + (l) )
 
/* Структура, состаящая из целого значения и указателя на такую же структуру */ 
typedef struct NODE {
    int value;
    struct NODE * next;
} node_t;
 
/* Функция добавляет значение в начало списка 
pStack - указатель на указатель на начало списка
nValue - добавляемое значение
возвращает 0 при удачном завершении, -1 при ошибке выделения памяти
*/ 
int push(node_t ** pStack, const int nValue) {
    node_t * pNode = malloc(sizeof(node_t));
    if ( ! pNode )
        return -1;
    
    pNode->value = nValue;
    pNode->next = *pStack;
    *pStack = pNode;
    
    return 0;
}
 
/* Функция присваивает переменной, на которую указывает pValue
значение первого элемента списка и удаляет этот элемент
возвращает 0 при удачном завершении, -1 если список пуст
*/ 
int pop(node_t ** pStack, int * pValue) {
    if ( ! *pStack )
        return -1;
    else { 
        node_t * pNode = (*pStack)->next;
        *pValue = (*pStack)->value;
        free(*pStack);
        *pStack = pNode;
    }
    
    return 0;
}
 
/* Нижняя и верхняя границы диапазона случайных чисел */ 
#define LOW (-50)
#define HIGH (50)
 
int main(void) {
    size_t count;
    
    srand(time(NULL));
    
    /* В цикле запрашивает количество элементов, выход - ввод символа, отличного от цифры или 0 */
    while ( printf("Number of elements: ") && scanf("%u", &count) == 1 && count ) {
        /* all - указатель на стек для всех чисел, pos - позитивных, neg - негативных */
        node_t * all, * pos, * neg;
        int curr;
        
        all = pos = neg = NULL;
        /* Запись в общий стек заданного количества элементов */
        while ( count-- ) {
            if ( push(&all, bounded_random(LOW, HIGH)) ) {
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
        }
        
        printf("All:\n");
        /* Пока из общего стека удаётся получить значение, вывод значения на экран
        и размещение в один из стеков pos/neg в зависимости от того, позитивное оно,
        или негативное */
        while ( ! pop(&all, &curr) ) {
            printf("%d ", curr);
            if ( curr < 0 ) {
                if ( push(&neg, curr) ) {
                    fprintf(stderr, "Memory error!\n");
                    exit(1);
                }
            }
            else {
                if ( push(&pos, curr) ) {
                    fprintf(stderr, "Memory error!\n");
                    exit(1);
                }
            }
        }
        
        /* вывод значений по очереди из стеков pos и neg */
        printf("\nPositive:\n");
        while ( ! pop(&pos, &curr) )
            printf("%d ", curr);
        
        printf("\nNegative:\n");
        while ( ! pop(&neg, &curr) )
            printf("%d ", curr);
        
        printf("\n");
        /* Память из-под стеков освобождать не приходится - это уже функция pop в цикле сделала */
    }
    
    exit(0);
}

Объяснение кода листинга программы

  1. Структура, представленная в коде, называется NODE и состоит из целого значения и указателя на такую же структуру.
  2. Функция push добавляет значение в начало списка. Она принимает указатель на указатель на начало списка и значение, которое нужно добавить, в качестве аргументов.
  3. Функция pop удаляет первый элемент списка и возвращает его значение. Она принимает указатель на указатель на начало списка и переменную для хранения значения удаленного элемента в качестве аргументов.
  4. В коде используется макрос bounded_random, который генерирует случайное число в заданном диапазоне.
  5. В цикле главной функции запрашивается количество элементов, которые нужно добавить в стек.
  6. Создаются три указателя: all, pos и neg, которые представляют общий стек, стек положительных чисел и стек отрицательных чисел соответственно.
  7. В цикле, пока количество элементов больше нуля, добавляется элемент в общий стек с помощью функции push.
  8. Затем в цикле, пока элементы могут быть удалены из общего стека, удаляется элемент, и его значение проверяется на положительность или отрицательность, после чего оно помещается в соответствующий стек.
  9. После завершения ввода всех элементов, выводятся все элементы стека all, затем все элементы стека pos, и, наконец, все элементы стека neg.
  10. Функция main возвращает 0, указывая на успешное выполнение программы.

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


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

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

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