【推荐】数据结构:链表栈 入栈,出栈,取栈顶。

基于链表实现入栈,出栈,取栈顶元素的操作      
           链式栈  
                  入栈     (链表头插) 比较方便
                  出栈     (链表头删)

这里写图片描述

头文件

#pragma once  //防止头文件重复定义

#include<stdio.h>
#include<stdlib.h>

typedef char Liststacktype;   //char类型

typedef struct Liststack
{
    Liststacktype data;      //当前节点保存元素
    struct Liststack* next;   //指向下一节点
}Liststack;

//初始化
void ListstackInit(Liststack** phead);

//创建节点
Liststack* ListnodeCreat(Liststacktype value);

//销毁节点

void  ListnodeDestroy(Liststack* node);

//入栈
void ListstackPush(Liststack**phead, Liststacktype value);

//出栈
void ListstackPop(Liststack**phead);

//取栈顶元素
Liststacktype ListstackGet(Liststack*head);

函数实现

#include"liststack.h"


//初始化
void ListstackInit(Liststack** phead)
{
    if (phead == NULL)
    {
        //非法输入
        return;
    }
    *phead = NULL;        
}

//创建节点
Liststack* ListnodeCreat(Liststacktype value)
{
    Liststack* new = (Liststack*)malloc(sizeof(Liststack));
    new->data = value;
    new->next = NULL;
    return new;
}

//销毁节点

void  ListnodeDestroy(Liststack* node)
{
    free(node);
    node = NULL;
}


//入栈   (头插)
void ListstackPush(Liststack**phead, Liststacktype value)
{
    if (phead == NULL)
    {
        return;
    }
    Liststack* new = ListnodeCreat(value);
    Liststack* cur = *phead;
    *phead = new;
    new->next = cur;
}

//出栈(头删)
void ListstackPop(Liststack** phead)
{
    if (phead == NULL)
    {
        printf("非法输入");
        return;
    }
    if (*phead == NULL)
    {
        printf("空链表");
        return;
    }
    Liststack* cur = *phead;    //指向头节点
    *phead = (*phead)->next;    
    ListnodeDestroy(cur);
    return;
}

//取栈顶元素
Liststacktype ListstackGet(Liststack* head)
{
    if (head == NULL)
    {
        return;
    }
    Liststack* cur = head;   //(若采用头插入栈)头节点即为栈顶元素
    return cur->data;

}

功能测试

#include"liststack.h"

#define FUNCTION() printf("************  %s  *************\n",__FUNCTION__) ;

//打印函数
void  Printchar(Liststack* head, const char *msg)
{
    printf("[ %s ]:\n", msg);
    if (head == NULL)
    {
        return;
    }
    Liststack* cur = head;
    while (cur!= NULL)
    {
        printf("[ %c ]", cur->data);
        cur = cur->next;
    }
    printf("\n");
    return;
}

void TeststackPush()
{
    FUNCTION();
    Liststack* head;
    ListstackInit(&head);

    ListstackPush(&head, 'a');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'b');
    Printchar(head, "入栈一个元素");
}

void TeststackPop()
{
    FUNCTION();
    Liststack* head;
    ListstackInit(&head);

    ListstackPush(&head, 'a');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'b');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'c');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'd');
    Printchar(head, "入栈一个元素");


    ListstackPop(&head);
    Printchar(head, "出栈一个元素");
    ListstackPop(&head);
    Printchar(head, "出栈一个元素");
}


void TeststackGet()
{
    FUNCTION();
    Liststack* head;
    ListstackInit(&head);

    ListstackPush(&head, 'a');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'b');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'c');
    Printchar(head, "入栈一个元素");
    ListstackPush(&head, 'd');
    Printchar(head, "入栈一个元素");

    Liststack* ret = ListstackGet(head);
    printf("栈顶元素:%c\n\n", ret);

    ListstackPop(&head);
    Printchar(head, "出栈一个元素");
    ret = ListstackGet(head);
    printf("栈顶元素:%c\n\n", ret);

}

int main()
{

    TeststackPush();
    TeststackPop();
    TeststackGet();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/yu876876/article/details/80001993