数据结构—栈链表

本文深入探讨了数据结构中的栈链表,阐述了栈的基本概念及其与链表的结合,包括栈的操作原理和实现方法。
摘要由CSDN通过智能技术生成

数据结构—栈链表


   首先还是简单说一下数据结构的堆栈与C语言里面的区别吧。(ps:这个在学习汇编的时候老师也讲过。忘记了,果然我还是太菜🐔了)
数据结构C语言
一种存储数据的格式内存空间
满足先进后出,后进先出的原则为向下增长的,栈中分配局部变量空间
类似于树一样的结构,根节点的值最小或最大为向上增长的,一般为申请的空间以及静态与全局变量
   学了这麽久,默默的感jio数据结构,学的就是结构体与指针如何搭配。(hahaha~~~)
   栈:在数据结构中就分为两类,线性栈和链栈,都是遵循一个原则先进后出,不能尾插,一些杂七杂八的不能用罢了,详细的还是请去琢磨书,我就简简单单的说一下了,详细的还是得直接看看书,冲冲冲🚀!详细的还是得直接看看书(Three times!)
/*
 * @Description: main.c
 * @Author: 小刘
 * @Date: 2020-11-22 19:41:25
 * @LastEditTime: 2020-11-23 14:37:23
 * @LastEditors: 小刘
 * @Reference: 
 * 
 */
/*The stack is similar to the linear table, but only part of 
 *the linear table can be operated!
 */

#include "stacklinklist.h"
#include "stacklinklist.c"

int main(int argc, const char *argv[])
{

    int i, j;
    LinkStack st;

    InitLinkStack(&st); // init stack memory

    for (int i = 1; i <= 5; i++)
    {

        CerateLinkStack(&st, i); //input some element in stack list
    }
    printf("element");
    ShowLinkStack(&st);

    i = GetTopLinkStack(&st); //  return stack top data
    printf("pop:    %d\n", i);

    j = LinkStackLenght(&st); //return stack length
    printf("length: %d\n", j);

    PopLinkStack(&st); // output stack top data
    ShowLinkStack(&st);

    DestoryStackLinke(&st); // free stack memory
    ShowLinkStack(&st);

    return 0;
}
/*
 * @Description: stacklinklist.c
 * @Author: 小刘
 * @Date: 2020-11-22 19:41:12
 * @LastEditTime: 2020-11-23 14:37:03
 * @LastEditors: 小刘
 * @Reference: 
 */
#include "stacklinklist.h"

void InitLinkStack(LinkStack *head)
{
    *head = NULL;
}

void CerateLinkStack(LinkStack *head, ElemType num) //LinkStack *s为二级指针
{

    StackNode *s = MALLOC(StackNode, 1);
    assert(s != NULL);
    s->data = num;
    if (*head == NULL)
    {
        *head = s;
        s->next = NULL;
    }
    else
    {
        s->next = *head;
        *head = s;
    }
}
void ShowLinkStack(LinkStack *head)
{

    StackNode *p = *head;
    while (p != NULL)
    {
        printf(" %d ", p->data);
        p = p->next;
    }
    putchar(10);
}

void PopLinkStack(LinkStack *head)
{

    StackNode *s = *head;
    (*head) = s->next;
    free(s);
    s = NULL;
}

int GetTopLinkStack(LinkStack *head)
{
    StackNode *s = *head;
    return s->data; // error function;
}

int LinkStackLenght(LinkStack *head)
{
    int i = 0;
    StackNode *s = *head;
    while (s != NULL)
    {
     s = s->next;
        i++;
    }
    return i;
}

void DestoryStackLinke(LinkStack *head)
{ // True way: top->0;

    // error function
    free(*head);
    (*head) = NULL;
}

/*
 * @Description: stacklinklist.h
 * @Author: 小刘
 * @Date: 2020-11-22 19:41:47
 * @LastEditTime: 2020-11-23 14:37:32
 * @LastEditors: 小刘
 * @Reference: 
 */
#ifndef __STACKLINKLIST_H
#define __STACKLINKLIST_H

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
#include <string.h>

#define ElemType int
#define MALLOC(type, num) (type *)malloc(sizeof(type) * (num))

typedef struct StackNode
{   //一定要满足stack的规则
    //链表的操作有些不能在stack里面用

    ElemType data;
    struct StackNode *next;

} StackNode;

typedef StackNode *LinkStack;

void InitLinkStack(LinkStack *head);
void CerateLinkStack(LinkStack *head, ElemType num);
void ShowLinkStack(LinkStack *head);
void PopLinkStack(LinkStack *head);
int TopLinkStack(LinkStack *head);
int LinkStackLenght(LinkStack *head);
void DestoryStackLinke(LinkStack *head);

#endif
   学的是思想,而非瞎几把操作.
   最后默默的说一句力扣上面的题目真的是不是人刷的,哭了!

ai

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

脑瓜子嗡嗡的小刘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值