栈(链式结构)

头文件MyStack.h

#ifndef _MYSTACK_H_
#define _MYSTACK_H_

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

typedef struct Node *pNode;
typedef struct Stack *LinkStack;

struct Node
{
    int data;
    pNode next;
};

struct Stack
{
    int size;                               // 栈顶指针
    pNode top;
};

LinkStack Create (void);                    // 创建栈
bool IsEmpty (LinkStack stack);             // 判断空栈
int GetSize (LinkStack stack);              // 获取栈大小
void Push (LinkStack stack, int val);        // 元素入栈
pNode GetTop (LinkStack stack);             // 获取栈顶元素
pNode Pop (LinkStack stack);                // 弹出栈顶元素
void Destory (LinkStack stack);             // 销毁栈

LinkStack
Create (void)
{
    LinkStack stack = (LinkStack)malloc (sizeof (struct Stack));

    if (stack == NULL)
    {
        printf ("Error Memoty!");

        exit (1);
    }

    stack -> top = NULL;
    stack -> size = 0;

    return stack;
}

bool
IsEmpty (LinkStack stack)
{
    if (stack -> top == NULL || stack -> size == 0)
    {
        return true;
    }

    return false;
}

int
GetSize (LinkStack stack)
{
    return stack -> size;
}

void
Push (LinkStack stack, int val)
{
    pNode p = (pNode)malloc (sizeof (struct Node));

    if (p != NULL)
    {
        p -> data = val;                            // 将数据储存在新节点中
        p -> next = GetTop (stack);                 // 将新节点与原栈顶相连接

        stack -> top = p;                           // 将新节点重新定义为栈顶
        stack -> size ++;
    }
}

pNode
GetTop (LinkStack stack)
{
    if (stack -> size != 0)
    {
        return stack -> top;
    }

    return NULL;
}

pNode
Pop (LinkStack stack)
{
    if (IsEmpty (stack))
    {
        return NULL;
    }

    pNode p = stack -> top;                         // 储存原栈顶

    stack -> top = stack -> top -> next;            // 将原栈顶下一元素重定义为栈顶
    stack -> size --;

    return p;                                       // 弹栈
}

void
Destory (LinkStack stack)
{
    if (IsEmpty (stack))
    {
        free (stack);

        printf ("当前为空栈,无需销毁!\n");

        return;
    }

    do
    {
        pNode p = Pop (stack);

        free (p);
    }
    while (stack -> size != 0);

    printf ("成功销毁栈!\n");
}

#endif // _MYSTACK_H_

测试文件main.c

#include "MyStack.h"
#include <time.h>


int main (void)
{
    srand ((unsigned) time (0));                                // 生成随机数
    LinkStack stack = NULL;
    stack = Create ();

    if (IsEmpty (stack))                                        // 测试是否创建为空栈
    {
        printf ("空栈!\n");
    }
    else
    {
        printf ("栈不为空!\n");
    }

    for (int i = 0; i < 10; i ++)
    {
        Push (stack, rand () % 100);                            // 随机数入栈
    }

    if (IsEmpty (stack))                                        // 测试是否元素入栈
    {
        printf ("空栈!\n");
    }
    else
    {
        printf ("栈不为空!\n");
    }

    printf ("栈的大小: %d \n", stack -> size);

    printf ("栈顶元素: %d \n", *((int *)GetTop (stack)));       // 强制转换 pNode => int

    while (stack -> size != 0)
    {
        printf ("%d ", *((int *)Pop (stack)));                  // 弹出栈顶元素
    }

    printf ("\n");

    Destory (stack);                                            // 销毁栈

    system ("pause");
    return 0;
}

结语

        栈的链式存储也称为链栈,和链表的存储原理一样,用指针来建立各个节点之间的逻辑关系;压栈和弹栈表现的尤为明显。

        链栈就是一个单端操作的链表,其插入 删除操作就是在链表的一端实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值