Обобщенный стек
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 60 из 61.
Задание
ЛегкоСтек — это фундаментальная структура данных, которая следует принципу Last-In-First-Out (LIFO): последний добавленный элемент удаляется первым. Представь стопку тарелок: ты добавляешь элементы сверху и удаляешь их сверху.
Давай создадим Generic Stack: универсальную структуру данных, способную хранить данные любого типа с использованием указателей void*. Твой стек будет следовать принципу Last-In-First-Out и поддерживать все основные операции.
Ты организуешь свой код в трёх файлах:
stack.h: Define структуруStackс тремя членами: массивvoid**для элементов,intдля индекса вершины (следующая свободная позиция) иintдля capacity. Declare прототипы function для создания стека (принимает capacity), добавления элемента, удаления элемента, просмотра верхнего элемента, проверки, пуст ли стек, и освобождения стека.stack.c: Implement свой обобщённый стек:create_stack: выделяет Stack в heap, выделяет массив items с given capacity, инициализирует top значением 0 и возвращает указательpush: добавляет элемент на вершину, если есть место (когда top меньше capacity)pop: удаляет и возвращает верхний элемент или возвращаетNULL, если стек emptypeek: возвращает верхний элемент, не удаляя его, илиNULL, если стек emptyis_empty: возвращает 1, если в стеке нет элементов, и 0 в противном случаеfree_stack: сначала освобождает массив items, а затем саму структуру Stack
main.c: Считай количество выполняемых операций. Затем для каждой operation считай command:push, за которым следует целое значение,popилиpeek. Create стек с capacity 10. Дляpushвыдели integer в heap и добавь его pointer. Дляpopполучи item, выведи его значение и освободи integer. Дляpeekвыведи значение, не удаляя его. Еслиpopилиpeekвызывается для empty стека, выведиempty. После выполнения всех операций освободи все оставшиеся items и стек.
Твоя программа получит:
- Количество операций
- Каждую operation в отдельной строке (
push X,popилиpeek)
Пример вывода, когда входные данные — 5, затем push 10, push 20, peek, pop, pop:
20
20
10Пример вывода, когда входные данные — 3, затем pop, push 42, peek:
empty
42Пример вывода, когда входные данные — 4, затем push 5, push 15, pop, pop:
15
5Помни, что твой стек хранит указатели void*: вызывающая сторона отвечает за выделение и освобождение фактических данных. При извлечении выполни приведение возвращённого void* обратно к int*, чтобы получить доступ к значению. Используй strcmp из <string.h> для сравнения строк command.
Попробуйте сами
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Создайте стек ёмкостью 10
// TODO: Обработайте каждую операцию
for (int i = 0; i < n; i++) {
char command[10];
scanf("%s", command);
if (strcmp(command, "push") == 0) {
int value;
scanf("%d", &value);
// TODO: Выделите целое число в куче и поместите его указатель
}
else if (strcmp(command, "pop") == 0) {
// TODO: Извлеките элемент
// - Если не NULL, выведите значение и освободите целое число
// - Если NULL (пустой стек), выведите "empty"
}
else if (strcmp(command, "peek") == 0) {
// TODO: Посмотрите на верхний элемент
// - Если не NULL, выведите значение (не удаляйте и не освобождайте)
// - Если NULL (пустой стек), выведите "empty"
}
}
// TODO: Освободите все оставшиеся элементы в стеке
// TODO: Освободите сам стек
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C