Преобразовать стек в два стека - 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); }
Объяснение кода листинга программы
- Структура, представленная в коде, называется
NODE
и состоит из целого значения и указателя на такую же структуру. - Функция
push
добавляет значение в начало списка. Она принимает указатель на указатель на начало списка и значение, которое нужно добавить, в качестве аргументов. - Функция
pop
удаляет первый элемент списка и возвращает его значение. Она принимает указатель на указатель на начало списка и переменную для хранения значения удаленного элемента в качестве аргументов. - В коде используется макрос
bounded_random
, который генерирует случайное число в заданном диапазоне. - В цикле главной функции запрашивается количество элементов, которые нужно добавить в стек.
- Создаются три указателя:
all
,pos
иneg
, которые представляют общий стек, стек положительных чисел и стек отрицательных чисел соответственно. - В цикле, пока количество элементов больше нуля, добавляется элемент в общий стек с помощью функции
push
. - Затем в цикле, пока элементы могут быть удалены из общего стека, удаляется элемент, и его значение проверяется на положительность или отрицательность, после чего оно помещается в соответствующий стек.
- После завершения ввода всех элементов, выводятся все элементы стека
all
, затем все элементы стекаpos
, и, наконец, все элементы стекаneg
. - Функция
main
возвращает 0, указывая на успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д