栈的链式存储实现过程

1、定义栈的数据结构:

/* 节点结构体*/
typedef struct Node {
    int value;             // 节点的值
    struct Node* next;     //  下一个节点的地址
} Node;
/* 栈结构体*/
typedef struct {
    Node* top;             // 栈顶,指向首个节点的地址
} Stack;

2、初始化栈

void InitStack(Stack* stack){
    stack->top = (Node*)malloc(sizeof(Node));   // 为栈顶申请内存
    stack->top->next = NULL;                    // 将栈顶的指向的下一个节点置为空,防止出现野指针
}

3、入栈,即向栈的头部追加一个新的节点

void Push(Stack *stack,int value){
    Node* node;                            // 创建新节点
    node = (Node*)malloc(sizeof(Node));    // 为节点申请内存
    node->value = value;                   // 为节点赋值
    node->next = stack->top->next;         // 将栈顶指向的节点放在新创的节点之后
    stack->top->next = node;               // 将栈顶指向新的节点 
}

4、出栈,即将队尾的元素弹出

Node* Pop(Stack *stack){
    Node* del = NULL;                     // 创建一个空节点用来储存首个节点
    del = stack->top->next;               // 将栈的首个节点赋值给刚刚创建的空节点
    if(del != NULL){                      // 判断栈内是否有节点
        stack->top->next = del->next;     // 将栈顶指向下一个节点 
    }
    return del;
}

5、 得到栈的长度

int Length(Stack *stack)
{
    int length = 0;
    Node *nNode;                // 创建新节点
    nNode = stack->top->next;   // 将栈顶指向节点赋值给新节点
    while (nNode != NULL)       // 判断是否循环到队尾
    {
        length++;
        nNode = nNode->next;    // 将指针指向下一个节点
    }
    return length;
}

5、显示单个节点的值

void NodeDisPlay(Node* node){
    printf("This Node Value is %d.\n",node->value);
}

6、遍历栈,每次将指针指向下个节点输入节点的值,通过指针是否为空判断是否到达栈尾

void StackDisplay(Stack *stack){
    Node *nNode;                 // 创建新节点
    nNode = stack->top->next;    // 将栈顶指向节点赋值给新节点
    while (nNode != NULL)        // 判断是否循环到队尾
    {
        NodeDisPlay(nNode);      // 显示当前节点的值
        nNode = nNode->next;     // 将指针指向下一个节点
    }
}
  1. 清空栈
void CleanStack(Stack *stack){
    Node *pNode, *tmp;            // pNode节点用来存储栈节点,tmp用来释放内存
    pNode = stack->top->next;     // 将栈顶指向节点赋值给pNode
    while(pNode != NULL){
        tmp = pNode;              // 记住需要释放的内存地址
        pNode = pNode->next;
        free(tmp);                // 释放该地址的内存
    }
}
  1. 销毁整个栈
void Destory(Stack *stack){
    CleanStack(stack);      // 首先清空栈
    free(stack->top);       // 释放栈
}
  1. 下面是完整的代码
#include <stdio.h>
#include <stdlib.h>


typedef struct Node
{
    int value;         // 节点的值
    struct Node *next; //  下一个节点的地址
} Node;
typedef struct
{
    Node *top; // 栈顶,指向首个节点的地址
} Stack;
void InitStack(Stack *stack)
{
    stack->top = (Node *)malloc(sizeof(Node)); // 为栈顶申请内存
    stack->top->next = NULL;                   // 将栈顶的指向的下一个节点置为空,防止出现野指针
}
void Push(Stack *stack, int value)
{
    Node *node;                          // 创建新节点
    node = (Node *)malloc(sizeof(Node)); // 为节点申请内存
    node->value = value;                 // 为节点赋值
    node->next = stack->top->next;       // 将栈顶指向的节点放在新创的节点之后
    stack->top->next = node;             // 将栈顶指向新的节点
}
Node *Pop(Stack *stack)
{
    Node *del = NULL;       // 创建一个空节点用来储存首个节点
    del = stack->top->next; // 将栈的首个节点赋值给刚刚创建的空节点
    if (del != NULL)
    {                                 // 判断栈内是否有节点
        stack->top->next = del->next; // 将栈顶指向下一个节点
    }
    return del;
}
int Length(Stack *stack)
{
    int length = 0;
    Node *nNode;              // 创建新节点
    nNode = stack->top->next; // 将栈顶指向节点赋值给新节点
    while (nNode != NULL)     // 判断是否循环到队尾
    {
        length++;
        nNode = nNode->next; // 将指针指向下一个节点
    }
    return length;
}
void NodeDisPlay(Node *node)
{
    printf("This Node Value is %d.\n", node->value);
}
void StackDisplay(Stack *stack)
{
    Node *nNode;              // 创建新节点
    nNode = stack->top->next; // 将栈顶指向节点赋值给新节点
    while (nNode != NULL)     // 判断是否循环到队尾
    {
        NodeDisPlay(nNode);  // 显示当前节点的值
        nNode = nNode->next; // 将指针指向下一个节点
    }
}
void CleanStack(Stack *stack)
{
    Node *pNode, *tmp;        // pNode节点用来存储栈节点,tmp用来释放内存
    pNode = stack->top->next; // 将栈顶指向节点赋值给pNode
    while (pNode != NULL)
    {
        tmp = pNode; // 记住需要释放的内存地址
        pNode = pNode->next;
        free(tmp); // 释放该地址的内存
    }
}
void Destory(Stack *stack)
{
    CleanStack(stack); // 首先清空栈
    free(stack->top);  // 释放栈
}

int main()
{
    Stack *stack;  
    InitStack(stack);
    Push(stack, 1);
    Push(stack, 2);
    Push(stack, 3);
    StackDisplay(stack);
    printf("This Stack's length is %d.\n",Length(stack));
    Node *newNode = Pop(stack);
    printf("This Stack's length is %d.\n", Length(stack));
    NodeDisPlay(newNode);
    StackDisplay(stack);
    Destory(stack);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,941评论 0 7
  • 在这篇文章里,我们来实现自定义的链式栈。首先我们来看看链式栈的结构及操作定义。 链式栈结构定义 首先,新建两个文件...
    我叫卡卡算了阅读 878评论 0 2
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,173评论 0 12
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,806评论 24 1,002
  • 怕一不小心,就活成了你 怕心里再不承认也没用 小事一件件地提醒着我 居然你就这么变成了两个迥然的镜像 厌恶一个,却...
    Cadendeng阅读 222评论 0 0