Извлечь из стека все элементы и вывести их значения, имея только указатель на его вершину - 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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы: iostream.h и malloc.h
- Определяем структуру стека (stack_t), которая содержит в себе один элемент - целочисленное значение и указатель на следующий элемент стека.
- Создаём две функции: stack_push и stack_pop.
- Функция stack_push принимает указатель на вершину стека и целочисленное значение, которое необходимо добавить в стек. В случае успешного выделения памяти, то есть если вызов malloc был успешным, мы добавляем новый элемент в стек.
- Функция stack_pop принимает указатель на вершину стека и удаляет верхний элемент стека, перемещая указатель на вершину на элемент вниз. Затем мы освобождаем память, выделенную под только что удалённый элемент стека.
- Определяем две макро-функции: stack_top и stack_empty.
- Макро-функция stack_top возвращает значение вершины стека.
- Макро-функция stack_empty возвращает не ноль, если стек пуст, и ноль в противном случае.
- В функции main создаём указатель на вершину стека и инициализируем его значением NULL.
- С помощью цикла for добавляем в стек первые 10 элементов.
- С помощью цикла while, который выполняется до тех пор, пока стек не пуст, мы выводим значение вершины стека, удаляем её из стека и увеличиваем счётчик.
- По завершении программы выводим счётчик.
- Возвращаем 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д