Реализация стека с использованием связанного списка в C: полное руководство с кодом

Вот реализация стека с использованием связанного списка в C:

#include <stdio.h>
#include <stdlib.h>
// Structure for each element in the stack
typedef struct Node {
    int data;
    struct Node* next;
} Node;
// Structure for the stack
typedef struct Stack {
    Node* top;
} Stack;
// Function to initialize an empty stack
Stack* createStack() {
    Stack* stack = (Stack*)malloc(sizeof(Stack));
    stack->top = NULL;
    return stack;
}
// Function to check if the stack is empty
int isEmpty(Stack* stack) {
    return stack->top == NULL;
}
// Function to push an element onto the stack
void push(Stack* stack, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = stack->top;
    stack->top = newNode;
    printf("%d pushed to the stack.\n", data);
}
// Function to pop an element from the stack
int pop(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot pop element.\n");
        return -1;
    }
    Node* temp = stack->top;
    int data = temp->data;
    stack->top = temp->next;
    free(temp);
    return data;
}
// Function to get the top element of the stack
int peek(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty.\n");
        return -1;
    }
    return stack->top->data;
}
// Function to display the elements in the stack
void display(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty.\n");
        return;
    }
    printf("Elements in the stack: ");
    Node* temp = stack->top;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}
// Function to free the memory allocated for the stack
void destroyStack(Stack* stack) {
    Node* temp;
    while (stack->top != NULL) {
        temp = stack->top;
        stack->top = stack->top->next;
        free(temp);
    }
    free(stack);
}
int main() {
    Stack* stack = createStack();
    push(stack, 10);
    push(stack, 20);
    push(stack, 30);
    display(stack);
    printf("Top element: %d\n", peek(stack));
    printf("Popped element: %d\n", pop(stack));
    display(stack);
    destroyStack(stack);
    return 0;
}

В этой реализации мы использовали связанный список для представления стека. Структура «Node» представляет каждый элемент стека, а структура «Stack» представляет сам стек. Стек инициализируется с помощью функции createStack, а элементы помещаются в стек с помощью функции push. Функция popудаляет и возвращает верхний элемент из стека, а функция peekвозвращает верхний элемент, не удаляя его. Функция isEmptyпроверяет, пуст ли стек, а функция displayпечатает элементы стека. Наконец, функция destroyStackосвобождает память, выделенную для стека.