Преобразовать стек в два стека - 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, указывая на успешное выполнение программы.