Создать два новых стека, с четными и нечетными элементами первоначального стека - 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);
    }
}

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

  1. Включаем необходимые заголовочные файлы: и
  2. Объявляем структуру узла: struct node { int val; struct node* next; }
  3. Объявляем функции: stack_push(struct node st, int val), stack_pop(struct node st)
  4. Функция stack_split(struct node s1, struct node s2, struct node** st) разделяет исходный стек s на два новых стека s1 и s2.
  5. В функции main создаем стек s из 30 элементов с помощью функции stack_push и вызываем функцию stack_split для разделения стека на два новых стека s1 и s2.
  6. Выводим адреса s1 и s2.
  7. Выводим нечетные числа из стека s1.
  8. Выводим четные числа из стека s2.
  9. В функции stack_push(struct node** st, int val) создаем новый узел, заполняем его значением val и добавляем в начало стека s.
  10. В функции stack_pop(struct node** st) удаляем первый элемент стека s и освобождаем память, выделенную под этот узел.

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


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

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

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