Структуры данных в C/C++

Структура данных стек (stack) в C и C++

В этом уроке вы реализуете операции стека по правилу «последним пришёл, первым ушёл» на фиксированном массиве в C и с std::stack в C++.

Введение

Со стеком (stack) работают только через вершину: push кладёт новый элемент наверх, pop снимает верхний элемент, а peek показывает вершину, не снимая её. Стек работает по правилу «последним пришёл, первым ушёл» (LIFO), как стопка книг.

Главное

  • Определите условия, которые всегда должны выполняться (инварианты), прежде чем писать операции.
  • Обрабатывайте случаи пустой и заполненной структуры и ошибки выделения памяти.
  • Оценивайте вместе сложность и управление памятью для каждой операции.

Как это работает

Делайте push и pop и убедитесь, что последний добавленный элемент всегда выходит первым.

Примеры кода на C и C++

C
Запустить →
main.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
C++
Запустить →
main.cpp
#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.

C

Данные (struct) и операции разделены, а память выделяется и освобождается вручную.

C++

Классы и контейнеры защищают целостность данных и сами управляют своими ресурсами.

Упражнения для практики

Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.

  • Добавьте тесты для пустого состояния и момента, когда достигнута максимальная ёмкость.
  • Напишите освобождение памяти и убедитесь, что утечек нет.
  • Сравните сложность с аналогичным контейнером стандартной библиотеки.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи