Создать два новых стека, с четными и нечетными элементами первоначального стека - C (СИ)
Формулировка задачи:
Дано указатель P1 на вершину непустого стека. Создать два новых стека , переместив в первый из них все элементы исходного стека с четными значениями, а во второй - с нечетными (элементы в новых стеках будут располагаться в порядке, обратном выходного , один из этих стеков может оказаться пустым ) . Вывести адреса вершин полученных стеков ( для пустого стека вывести NULL) .
Решение задачи: «Создать два новых стека, с четными и нечетными элементами первоначального стека»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> struct node { int val; struct node* next; }; int stack_push(struct node** st, int val); void stack_pop(struct node** st); //разделение стека на два стека void stack_split(struct node** s1, struct node** s2, struct node** st){ struct node* p = *st; for(*s1 = *s2 = NULL; p != NULL; ){ if(p->val % 2){ *s1 = p; p = p->next; s1 = &(*s1)->next; } else { *s2 = p; p = p->next; s2 = &(*s2)->next; } } *s1 = *s2 = *st = NULL; } int main(void){ int i; struct node* s1, *s2, *st = NULL; for(i = 0; i < 30; ++i) stack_push(&st, i); stack_split(&s1, &s2, &st); //адреса printf("addr ptr - s1: 0x%08X\n", s1); printf("addr ptr - s2: 0x%08X\n\n", s2); //вывести не чётные числа while(s1 != NULL){ printf("%d ", s1->val); s1 = s1->next; } putchar('\n'); //вывести чётные числа while(s2 != NULL){ printf("%d ", s2->val); s2 = s2->next; } putchar('\n'); return 0; } //втолкнуть int stack_push(struct node** st, int val){ struct node* p = (struct node*)malloc(sizeof(struct node)); if(p != NULL){ p->val = val; p->next = *st; *st = p; } return (p != NULL); } //вытолкнуть void stack_pop(struct node** st){ struct node* t = *st; if(t != NULL){ *st = (*st)->next; free(t); } }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
и - Объявляем структуру узла: struct node { int val; struct node* next; }
- Объявляем функции: stack_push(struct node st, int val), stack_pop(struct node st)
- Функция stack_split(struct node s1, struct node s2, struct node** st) разделяет исходный стек s на два новых стека s1 и s2.
- В функции main создаем стек s из 30 элементов с помощью функции stack_push и вызываем функцию stack_split для разделения стека на два новых стека s1 и s2.
- Выводим адреса s1 и s2.
- Выводим нечетные числа из стека s1.
- Выводим четные числа из стека s2.
- В функции stack_push(struct node** st, int val) создаем новый узел, заполняем его значением val и добавляем в начало стека s.
- В функции stack_pop(struct node** st) удаляем первый элемент стека s и освобождаем память, выделенную под этот узел.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д