栈的链式存储框架

 定义

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

  允许插入和删除的一端称为栈顶(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\n", 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\n", p->name, p->age);
45         //弹出栈顶元素
46         Pop_LinkStack(stack);
47     }
48     //销毁栈
49     FreeSpace_LinkStack(stack);
50 
51     return 0;
52 }

 

posted @ 2019-05-17 15:07  鲸小鱼-  阅读(281)  评论(0编辑  收藏  举报