Структура данных стек (stack) в C и C++
В этом уроке вы реализуете операции стека по правилу «последним пришёл, первым ушёл» на фиксированном массиве в C и с std::stack в C++.
Введение
Со стеком (stack) работают только через вершину: push кладёт новый элемент наверх, pop снимает верхний элемент, а peek показывает вершину, не снимая её. Стек работает по правилу «последним пришёл, первым ушёл» (LIFO), как стопка книг.
Главное
- Определите условия, которые всегда должны выполняться (инварианты), прежде чем писать операции.
- Обрабатывайте случаи пустой и заполненной структуры и ошибки выделения памяти.
- Оценивайте вместе сложность и управление памятью для каждой операции.
Как это работает
Делайте push и pop и убедитесь, что последний добавленный элемент всегда выходит первым.
Примеры кода на C и C++
#include <stdio.h>
typedef struct {
int data[8];
int size;
} Stack;
int push(Stack *stack, int value) {
if (stack->size == 8) return 0;
stack->data[stack->size++] = value;
return 1;
}
int pop(Stack *stack, int *value) {
if (stack->size == 0) return 0;
*value = stack->data[--stack->size];
return 1;
}
int main(void) {
Stack stack = {{0}, 0};
int value;
push(&stack, 10);
push(&stack, 20);
pop(&stack, &value);
printf("%d\n", value);
}
20
#include <iostream>
#include <stack>
int main() {
std::stack<int> values;
values.push(10);
values.push(20);
std::cout << values.top() << '\n';
values.pop();
}
20
Сравнение C и C++
Версия на C использует фиксированный массив из 8 элементов, поэтому при push нужно проверять, не заполнен ли стек (переполнение стека), а при pop, не пуст ли он. В C++ std::stack управляет ёмкостью через базовый контейнер и предлагает те же операции push, pop и top по правилу LIFO.
Данные (struct) и операции разделены, а память выделяется и освобождается вручную.
Классы и контейнеры защищают целостность данных и сами управляют своими ресурсами.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Добавьте тесты для пустого состояния и момента, когда достигнута максимальная ёмкость.
- Напишите освобождение памяти и убедитесь, что утечек нет.
- Сравните сложность с аналогичным контейнером стандартной библиотеки.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
Все задачи