Динамическая реализация стека на основе списка - C (СИ)
Формулировка задачи:
Реализация стека с помощью динамических структур (списка) . Добавить элемент в стек ,удаление элемента из стека,проверка пустой ли стек ,просмотр элемента в вершине стека без удаления ,очистка стэка.
Решение задачи: «Динамическая реализация стека на основе списка»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
struct node
{
int value;
struct node *next;
};
struct myStack
{
struct node *pointer;
int count;
};
struct myStack *create_stack()
{
struct myStack *temp = (struct myStack *)malloc(sizeof(struct myStack));
temp->pointer = NULL;
temp->count = 0;
return temp;
}
void delete_element(struct node *elem)
{
if (elem->next) delete_element(elem->next);
free(elem);
}
void delete_stack(struct myStack *st)
{
if (!st) return;
if (st->pointer) delete_element(st->pointer);
free(st);
}
void push_to_stack(struct myStack *st, int value)
{
if (!st) return;
struct node *temp = (struct node *)malloc(sizeof(struct node));
temp->value = value;
if (!st->pointer) { temp->next = NULL; st->pointer = temp; }
else { temp->next = st->pointer; st->pointer = temp; }
st->count++;
}
int pop_from_stack(struct myStack *st)
{
if (!st || !st->pointer) return 0;
int value = st->pointer->value;
struct node *del = st->pointer;
st->pointer = st->pointer->next;
free(del);
st->count--;
return value;
}
int stack_size(struct myStack *st)
{
return st->count;
}
int is_empty(struct myStack *st)
{
return !st->pointer;
}
int main()
{
struct myStack *st = create_stack();
int i;
for (i = 5; i < 10; ++i)
push_to_stack(st, i);
while (!is_empty(st))
{
printf("%d\n", pop_from_stack(st));
}
delete_stack(st);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем структуру узла списка
- Объявляем структуру стека на основе списка
- Создаем функцию для создания нового стека
- Создаем функцию для удаления элемента из списка (удаляет все элементы до указанного)
- Создаем функцию для удаления стека (освобождает память выделенную под стек)
- Создаем функцию для добавления элемента в стек (используется динамическое выделение памяти под новый узел)
- Создаем функцию для удаления элемента из стека (первый элемент, который встретится при обходе списка, начиная с указанного)
- Создаем функцию для проверки размера стека
- Создаем функцию для проверки на пустоту стека
- В функции main создаем новый стек
- Добавляем элементы в стек
- Пока стек не пуст, выводим его содержимое и удаляем один элемент
- Удаляем стек
- Завершаем программу