数据结构与算法学习笔记七---链栈的表示和实现(C语言)

目录

一、什么是链栈

二、链栈的表示和实现

1.初始化

2.销毁

3.清空

4.栈空

5.栈长度

6.栈顶元素

7.入栈

8.出栈

8.遍历栈

9.测试代码


    这篇文章主要讲栈的顺序表示和实现。

一、什么是链栈

        链栈是指采用链式存储结构实现的栈。
        链栈的定义如下:

#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10   // 存储空间分配增量
#define ElementType int
typedef int Status;

typedef struct{
    ElementType * base;// 栈底指针
    ElementType * top; // 栈顶指针
    int stacksize; // 栈的当前可以使用的最大容量
}SeqStack;

二、链栈的表示和实现

1.初始化

        链栈的初始化操作就是构造一个空栈,因为没必要设头结点,所以直接将栈顶指针置空即可.

// 初始化链栈
Status initLinkStack(LinkStack *linkStack) {
    *linkStack = NULL;
    return 1;
}

2.销毁

        销毁栈中指针

// 销毁链栈
void destroyLinkStack(LinkStack *linkStack) {
    LinkStack p = *linkStack;
    while (p) {
        LinkStack temp = p;
        p = p->next;
        free(temp);
    }
    *linkStack = NULL;
}

3.清空

// 清空链栈
void clearLinkStack(LinkStack *linkStack) {
    LinkStack p = *linkStack;
    while (p) {
        LinkStack temp = p;
        p = p->next;
        free(temp);
    }
    *linkStack = NULL;
}

4.栈空

// 判断链栈是否为空
Status linkStackEmpty(LinkStack *linkStack) {
    return *linkStack == NULL;
}

5.栈长度

// 返回链栈长度
int linkStackLength(LinkStack *linkStack) {
    int length = 0;
    LinkStack p = *linkStack;
    while (p) {
        length++;
        p = p->next;
    }
    return length;
}

6.栈顶元素

// 获取栈顶元素
Status getLinkStackTop(LinkStack *linkStack, int *element) {
    if (linkStackEmpty(linkStack)) {
        return 0;
    }
    *element = (*linkStack)->data;
    return 1;
}

7.入栈

// 入栈
Status pushLinkStack(LinkStack *linkStack, ElementType element) {
    LinkStack newNode = (LinkStack)malloc(sizeof(StackNode));
    if (!newNode) {
        return 0; // 内存分配失败
    }
    newNode->data = element;
    newNode->next = *linkStack;
    *linkStack = newNode;
    return 1;
}

8.出栈

// 出栈
Status popLinkStack(LinkStack *linkStack, int *element) {
    if (linkStackEmpty(linkStack)) {
        return 0; // 栈空,无法出栈
    }
    LinkStack temp = *linkStack;
    *element = temp->data;
    *linkStack = temp->next;
    free(temp);
    return 1;
}

8.遍历栈

// 遍历链栈
void traverseLinkStack(LinkStack *linkStack) {
    LinkStack p = *linkStack;
    while (p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
}

9.测试代码

#include <stdlib.h>
#define ElementType int
typedef int Status;

typedef struct StackNode{
    ElementType data;
    struct StackNode * next;
}StackNode,*LinkStack;
// 初始化链栈
Status initLinkStack(LinkStack *linkStack) {
    *linkStack = NULL;
    return 1;
}

// 销毁链栈
void destroyLinkStack(LinkStack *linkStack) {
    LinkStack p = *linkStack;
    while (p) {
        LinkStack temp = p;
        p = p->next;
        free(temp);
    }
    *linkStack = NULL;
}

// 清空链栈
void clearLinkStack(LinkStack *linkStack) {
    LinkStack p = *linkStack;
    while (p) {
        LinkStack temp = p;
        p = p->next;
        free(temp);
    }
    *linkStack = NULL;
}

// 判断链栈是否为空
Status linkStackEmpty(LinkStack *linkStack) {
    return *linkStack == NULL;
}

// 返回链栈长度
int linkStackLength(LinkStack *linkStack) {
    int length = 0;
    LinkStack p = *linkStack;
    while (p) {
        length++;
        p = p->next;
    }
    return length;
}

// 获取栈顶元素
Status getLinkStackTop(LinkStack *linkStack, int *element) {
    if (linkStackEmpty(linkStack)) {
        return 0;
    }
    *element = (*linkStack)->data;
    return 1;
}

// 入栈
Status pushLinkStack(LinkStack *linkStack, ElementType element) {
    LinkStack newNode = (LinkStack)malloc(sizeof(StackNode));
    if (!newNode) {
        return 0; // 内存分配失败
    }
    newNode->data = element;
    newNode->next = *linkStack;
    *linkStack = newNode;
    return 1;
}

// 出栈
Status popLinkStack(LinkStack *linkStack, int *element) {
    if (linkStackEmpty(linkStack)) {
        return 0; // 栈空,无法出栈
    }
    LinkStack temp = *linkStack;
    *element = temp->data;
    *linkStack = temp->next;
    free(temp);
    return 1;
}
// 遍历链栈
void traverseLinkStack(LinkStack *linkStack) {
    LinkStack p = *linkStack;
    while (p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
}




void testLinkStack(void) {
    LinkStack linkStack;
    printf("链栈初始化中...\n");
    if (initLinkStack(&linkStack)) {
        printf("链栈初始化成功\n");
    } else {
        printf("链栈初始化失败\n");
    }
    
    printf("入栈...\n");
    if (pushLinkStack(&linkStack, 1)) {
        printf("入栈成功\n");
    }
    if (pushLinkStack(&linkStack, 2)) {
        printf("入栈成功\n");
    }
    if (pushLinkStack(&linkStack, 3)) {
        printf("入栈成功\n");
    }
    
    printf("栈中元素:\n");
    traverseLinkStack(&linkStack);
    
    printf("栈的长度:%d\n", linkStackLength(&linkStack));
    
    if (!linkStackEmpty(&linkStack)) {
        printf("栈不为空\n");
    }
    
    int top;
    if (getLinkStackTop(&linkStack, &top)) {
        printf("栈顶元素获取成功\n");
        printf("栈顶元素:%d\n", top);
    }
    
    // 出栈测试
    int element;
    if (popLinkStack(&linkStack, &element)) {
        printf("出栈成功,出栈元素为:%d\n", element);
    }
    if (popLinkStack(&linkStack, &element)) {
        printf("出栈成功,出栈元素为:%d\n", element);
    }
    if (popLinkStack(&linkStack, &element)) {
        printf("出栈成功,出栈元素为:%d\n", element);
    }
    
    printf("栈的长度:%d\n", linkStackLength(&linkStack));
    
    if (linkStackEmpty(&linkStack)) {
        printf("栈为空\n");
    }
    
    destroyLinkStack(&linkStack);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我叫柱子哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值