Создать два новых стека, с четными и нечетными элементами первоначального стека - 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 и освобождаем память, выделенную под этот узел.