Извлечь из стека все элементы и вывести их значения, имея только указатель на его вершину - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дано указатель P1 на вершину стека (если стек пуст, то P1 = NULL). Извлечь из стека все элементы и вывести их значения. Вывести также количество извлеченных элементов N (для пустого стека вывести 0). После извлечения элементов из стека освобождать память, которую они занимали.

Решение задачи: «Извлечь из стека все элементы и вывести их значения, имея только указатель на его вершину»

textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
 
typedef struct _stack {
    int val;
    struct _stack* next;
} stack_t;
 
 
void stack_push(stack_t** st, int val){
    stack_t* p = (stack_t*)malloc(sizeof(stack_t));
    if(p != NULL){
        p->val  = val;
        p->next = *st;
        *st = p;
    }
}
 
void stack_pop(stack_t** st){
    stack_t* t = *st;
    if(t != NULL){
        *st = (*st)->next;
        free(t);
    }
}
 
#define stack_top(st)    (st)->val
#define stack_empty(st)  ((st) == NULL)
 
 
int main(void){
    int      i;
    stack_t* st = NULL;
 
    for(i = 0; i < 10; ++i)
        stack_push(&st, i);
 
    i = 0;
    while(! stack_empty(st)){
        printf("%d ", stack_top(st));
        stack_pop(&st);
        ++i;
    }
    printf("\ncount: %d\n", i);
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы: iostream.h и malloc.h
  2. Определяем структуру стека (stack_t), которая содержит в себе один элемент - целочисленное значение и указатель на следующий элемент стека.
  3. Создаём две функции: stack_push и stack_pop.
  4. Функция stack_push принимает указатель на вершину стека и целочисленное значение, которое необходимо добавить в стек. В случае успешного выделения памяти, то есть если вызов malloc был успешным, мы добавляем новый элемент в стек.
  5. Функция stack_pop принимает указатель на вершину стека и удаляет верхний элемент стека, перемещая указатель на вершину на элемент вниз. Затем мы освобождаем память, выделенную под только что удалённый элемент стека.
  6. Определяем две макро-функции: stack_top и stack_empty.
  7. Макро-функция stack_top возвращает значение вершины стека.
  8. Макро-функция stack_empty возвращает не ноль, если стек пуст, и ноль в противном случае.
  9. В функции main создаём указатель на вершину стека и инициализируем его значением NULL.
  10. С помощью цикла for добавляем в стек первые 10 элементов.
  11. С помощью цикла while, который выполняется до тех пор, пока стек не пуст, мы выводим значение вершины стека, удаляем её из стека и увеличиваем счётчик.
  12. По завершении программы выводим счётчик.
  13. Возвращаем 0, что означает успешный конец работы программы.

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


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

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

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