C++ 通过链表实现的栈

#ifndef __LINKED_LIST_STACK_C2025__
#define __LINKED_LIST_STACK_C2025__

typedef int linked_list_stack_data;

typedef struct linked_list_stack_node_t
{
    linked_list_stack_data data;
    struct linked_list_stack_node_t *next;
} linked_list_stack_node, *linked_list_stack_ptr, *linked_list_stack_node_ptr;

bool is_empty_linked_list_stack(linked_list_stack_ptr stack);



void push_linked_list_stack(linked_list_stack_ptr stack, linked_list_stack_data data);

linked_list_stack_data pop_linked_list_stack(linked_list_stack_ptr stack);

void out_linked_list_stack(linked_list_stack_ptr stack);

void clear_linked_list_stack(linked_list_stack_ptr stack);

linked_list_stack_ptr create_linked_list_stack();

linked_list_stack_node_ptr make_linked_list_node(linked_list_stack_data data);

void free_linked_list_stack(linked_list_stack_ptr stack);

#define destroy_linked_list_stack(stack)   \
    do                                     \
    {                                      \
        if (stack)                         \
        {                                  \
            free_linked_list_stack(stack); \
            stack = null;                  \
        }                                  \
    } while (0)

#endif

#include "../util.h"
#include "linked_list_stack.h"

bool is_empty_linked_list_stack(linked_list_stack_ptr stack)
{
    return !stack || !stack->next;
}

void push_linked_list_stack(linked_list_stack_ptr stack, linked_list_stack_data data)
{
    if (stack)
    {
        linked_list_stack_node_ptr node = make_linked_list_node(data);
        node->next = stack->next;
        stack->next = node;
    }
}

linked_list_stack_data pop_linked_list_stack(linked_list_stack_ptr stack)
{
    linked_list_stack_data d = 0;
    if (!is_empty_linked_list_stack(stack))
    {
        linked_list_stack_node_ptr p = stack->next;
        stack->next = p->next;
        d = p->data;
        free(p);
        p = null;
    }
    return d;
}

void out_linked_list_stack(linked_list_stack_ptr stack)
{
    if (!is_empty_linked_list_stack(stack))
    {
        linked_list_stack_node_ptr p = stack->next;
        while (p->next)
        {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("%d\n", p->data);
    }
}

void clear_linked_list_stack(linked_list_stack_ptr stack)
{
    if (!is_empty_linked_list_stack(stack))
    {
        linked_list_stack_node_ptr p = stack->next;
        free_linked_list_stack(p);
        stack->next = null;
    }
}

linked_list_stack_node_ptr make_linked_list_node(linked_list_stack_data data)
{
    linked_list_stack_node_ptr p = malloc(sizeof(linked_list_stack_node));
    if (p)
    {
        p->data = data;
        p->next = null;
    }
    return p;
}

linked_list_stack_ptr create_linked_list_stack()
{
    return make_linked_list_node(0);
}

void free_linked_list_stack(linked_list_stack_ptr stack)
{
    if (stack)
    {
        linked_list_stack_node_ptr p = stack;
        while (p)
        {
            linked_list_stack_node_ptr r = p;
            p = p->next;
            r->next = null;
            free(r);
            r = null;
        }
    }
}
#include "../util.h"
#include "linked_list_stack.h"

int next_rand_limit_max(int max)
{
    static bool not_inited = true;
    if (not_inited)
    {
        srand(time(null));
        not_inited = false;
    }
    return rand() % max;
}

int main()
{

    linked_list_stack_ptr stack = create_linked_list_stack();

    p_i(is_empty_linked_list_stack(stack));

    p_str("start");
    out_linked_list_stack(stack);
    p_str("end");

    for (int i = 0; i < 20; i++)
    {
        push_linked_list_stack(stack, i);
        // printf("%d ", i);
    }
    // printf("%d\n", 20);
    push_linked_list_stack(stack, 20);
    out_linked_list_stack(stack);

    for (int i = 0; i < 19; i++)
    {
        linked_list_stack_data data = pop_linked_list_stack(stack);
        printf("%d ", data);
    }
    printf("%d\n", pop_linked_list_stack(stack));
    printf("%d\n", pop_linked_list_stack(stack));

    p_i(is_empty_linked_list_stack(stack));

    for (int i = 0; i < 30; i++)
    {
        push_linked_list_stack(stack, next_rand_limit_max(100));
    }

    out_linked_list_stack(stack);

    clear_linked_list_stack(stack);

    p_i(is_empty_linked_list_stack(stack));

    p_str("start");
    out_linked_list_stack(stack);
    p_str("end");

    destroy_linked_list_stack(stack);

    p_a(stack);

    return 0;
}
1
start
end
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
0
1
73 4 36 75 35 43 98 83 65 81 78 94 91 72 60 57 74 41 62 31 94 77 28 95 30 90 86 51 68 7
1
start
end
(nil)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值