zoukankan      html  css  js  c++  java
  • 栈的链式存储框架

     定义

      栈是限定只能在表尾删除和插入操作的线性表。

      允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

      栈的插入操作称为进栈,也称压栈、入栈。

      栈的删除操作称为出栈,也称弹栈。

     栈的抽象数据结构

      由于栈本身就是一个线性表,所以线性表的操作特性它都具备,针对它的特殊性,在它的操作上可能会有一些变化。将进栈和出栈分别改名为push和pop。

      由于栈本身是一个线性表,所以线性表的顺序存储结构和链式存储结构同样适用于栈。

    栈的链式存储框架搭建

    链式栈的结点

    typedef struct LINKNODE {
        struct LINKNODE* next;
    }LinkNode;

    链式栈

    typedef struct LINKSTACK {
        LinkNode head;
        int size;
    }LinkStack;

    构架搭建

    //初始化栈
    LinkStack *Init_LinkStack();
    //入栈
    void Push_LinkStack(LinkStack* stack, LinkNode* data);
    //返回栈顶元素
    LinkNode* Top_LinkStack(LinkStack* stack);
    //出栈
    void Pop_LinkStack(LinkStack* stack);
    //返回栈中元素个数
    int Size_LinkStack(LinkStack* stack);
    //清空栈
    void Clear_LinkStack(LinkStack* stack);
    //销毁栈
    void FreeSpace_LinkStack(LinkStack* stack);

    栈的链式存储框架实现

    初始化栈

    LinkStack *Init_LinkStack()
    {
        LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
        stack->head.next = NULL;
        stack->size = 0;
        return stack;
    }

    入栈

    void Push_LinkStack(LinkStack* stack, LinkNode* data)
    {
        if (stack == NULL)
            return ;
        if (data == NULL)
            return ;
        data->next = stack->head.next;
        stack->head.next = data;
        stack->size++;
    }

    返回栈顶元素

    LinkNode* Top_LinkStack(LinkStack* stack)
    {
        if (stack == NULL)
            return NULL;
        if (stack->size == 0)
            return NULL;
        return stack->head.next;
    }

    出栈

    void Pop_LinkStack(LinkStack* stack)
    {
        if (stack == NULL)
            return;
        if (stack->size == 0)
            return;
        //第一个有效结点
        LinkNode* pNext = stack->head.next;
        stack->head.next = pNext->next;
        stack->size--;
    }

    返回栈中元素个数

    int Size_LinkStack(LinkStack* stack)
    {
        if (stack == NULL)
            return -1;
        return stack->size;
    }

    清空栈

    void Clear_LinkStack(LinkStack* stack)
    {
        if (stack == NULL)
            return;
        stack->head.next = NULL;
        stack->size = 0;
    }

    销毁栈

    void FreeSpace_LinkStack(LinkStack* stack)
    {
        if (stack == NULL)
            return;
        free(stack);
    }

    栈的链式存储框架测试

    测试思路

    创建栈

        LinkStack *stack = Init_LinkStack();

    创建数据

      创建数据包括两步:创建结构体类型和数据初始化

    创建结构体类型

    typedef struct PERSON {
        LinkNode node;
        char name[64];
        int age;
    }Person;

    数据初始化

        Person p1, p2, p3, p4, p5;
        strcpy(p1.name, "aaa");
        strcpy(p2.name, "bbb");
        strcpy(p3.name, "ccc");
        strcpy(p4.name, "ddd");
        strcpy(p5.name, "eee");
        p1.age = 10;
        p2.age = 20;
        p3.age = 30;
        p4.age = 40;
        p5.age = 50;

    入栈

        Push_LinkStack(stack, (LinkNode*)&p1);
        Push_LinkStack(stack, (LinkNode*)&p2);
        Push_LinkStack(stack, (LinkNode*)&p3);
        Push_LinkStack(stack, (LinkNode*)&p4);
        Push_LinkStack(stack, (LinkNode*)&p5);

    输出

        while (Size_LinkStack(stack)>0)
        {
            //取出栈顶元素
            Person* p = (Person*)Top_LinkStack(stack);
            printf("Name:%s  Age:%d
    ", p->name, p->age);
            //弹出栈顶元素
            Pop_LinkStack(stack);
        }

    销毁栈

        FreeSpace_LinkStack(stack);

    运行结果

    源码

    LinkStack.h

     1 #pragma once
     2 
     3 #include<stdlib.h>
     4 #include<stdio.h>
     5 
     6 //链式栈的结点
     7 typedef struct LINKNODE {
     8     struct LINKNODE* next;
     9 }LinkNode;
    10 
    11 //链式栈
    12 typedef struct LINKSTACK {
    13     LinkNode head;
    14     int size;
    15 }LinkStack;
    16 
    17 //初始化栈
    18 LinkStack *Init_LinkStack();
    19 //入栈
    20 void Push_LinkStack(LinkStack* stack, LinkNode* data);
    21 //返回栈顶元素
    22 LinkNode* Top_LinkStack(LinkStack* stack);
    23 //出栈
    24 void Pop_LinkStack(LinkStack* stack);
    25 //返回栈中元素个数
    26 int Size_LinkStack(LinkStack* stack);
    27 //清空栈
    28 void Clear_LinkStack(LinkStack* stack);
    29 //销毁栈
    30 void FreeSpace_LinkStack(LinkStack* stack);

    LinkStack.c

     1 #include"LinkStack.h"
     2 
     3 //初始化栈
     4 LinkStack *Init_LinkStack()
     5 {
     6     LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
     7     stack->head.next = NULL;
     8     stack->size = 0;
     9     return stack;
    10 }
    11 //入栈
    12 void Push_LinkStack(LinkStack* stack, LinkNode* data)
    13 {
    14     if (stack == NULL)
    15         return ;
    16     if (data == NULL)
    17         return ;
    18     data->next = stack->head.next;
    19     stack->head.next = data;
    20     stack->size++;
    21 }
    22 //返回栈顶元素
    23 LinkNode* Top_LinkStack(LinkStack* stack)
    24 {
    25     if (stack == NULL)
    26         return NULL;
    27     if (stack->size == 0)
    28         return NULL;
    29     return stack->head.next;
    30 }
    31 //出栈
    32 void Pop_LinkStack(LinkStack* stack)
    33 {
    34     if (stack == NULL)
    35         return;
    36     if (stack->size == 0)
    37         return;
    38     //第一个有效结点
    39     LinkNode* pNext = stack->head.next;
    40     stack->head.next = pNext->next;
    41     stack->size--;
    42 }
    43 
    44 //返回栈中元素个数
    45 int Size_LinkStack(LinkStack* stack)
    46 {
    47     if (stack == NULL)
    48         return -1;
    49     return stack->size;
    50 }
    51 //清空栈
    52 void Clear_LinkStack(LinkStack* stack)
    53 {
    54     if (stack == NULL)
    55         return;
    56     stack->head.next = NULL;
    57     stack->size = 0;
    58 }
    59 //销毁栈
    60 void FreeSpace_LinkStack(LinkStack* stack)
    61 {
    62     if (stack == NULL)
    63         return;
    64     free(stack);
    65 }

    main.c

     1 #define _CRT_SECURE_NO_WARNINGS
     2 
     3 #include<stdlib.h>
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include"LinkStack.h"
     7 
     8 typedef struct PERSON {
     9     LinkNode node;
    10     char name[64];
    11     int age;
    12 }Person;
    13 
    14 int main()
    15 {
    16     //创建栈
    17     LinkStack *stack = Init_LinkStack();
    18 
    19     //创建数据
    20     Person p1, p2, p3, p4, p5;
    21     strcpy(p1.name, "aaa");
    22     strcpy(p2.name, "bbb");
    23     strcpy(p3.name, "ccc");
    24     strcpy(p4.name, "ddd");
    25     strcpy(p5.name, "eee");
    26     p1.age = 10;
    27     p2.age = 20;
    28     p3.age = 30;
    29     p4.age = 40;
    30     p5.age = 50;
    31 
    32     //入栈
    33     Push_LinkStack(stack, (LinkNode*)&p1);
    34     Push_LinkStack(stack, (LinkNode*)&p2);
    35     Push_LinkStack(stack, (LinkNode*)&p3);
    36     Push_LinkStack(stack, (LinkNode*)&p4);
    37     Push_LinkStack(stack, (LinkNode*)&p5);
    38 
    39     //输出
    40     while (Size_LinkStack(stack)>0)
    41     {
    42         //取出栈顶元素
    43         Person* p = (Person*)Top_LinkStack(stack);
    44         printf("Name:%s  Age:%d
    ", p->name, p->age);
    45         //弹出栈顶元素
    46         Pop_LinkStack(stack);
    47     }
    48     //销毁栈
    49     FreeSpace_LinkStack(stack);
    50 
    51     return 0;
    52 }
  • 相关阅读:
    jquery proxy && delegate 的比较
    最近开发问题记录
    调研雅黑字体在各浏览器的显示
    我对浮动的认识(一)
    我对浮动的理解和认识(二)
    跨浏览器事件的其他问题(小记)
    web数据交互方式
    闪光字的处理
    IE hasLayout的问题总结
    文字内容溢出用点点点(...)省略号
  • 原文地址:https://www.cnblogs.com/lixuejian/p/10881429.html
Copyright © 2011-2022 走看看