数据结构之链式栈的实现

上篇博客我们已经对栈的基本操作有了介绍,现在我们利用链表的方式来实现一下栈的基本操作。
其实利用链表更好实现栈,因为我们链表的头插与头删恰好可以与栈相对应,先进的后出,这里我们就不过多的赘述,直接进行实现即可。

//linkstack.h

#pragma once

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

typedef char LinkStackType;

typedef struct LinkStackNode{
  LinkStackType data;
  struct LinkStackNode* next;
}LinkStackNode;

LinkStackNode* head;

void LinkStackInit(LinkStackNode** phead);//初始化链式栈

void LinkStackPush(LinkStackNode** phead, LinkStackType value);//链式栈的入栈

void LinkStackPop(LinkStackNode** phead);//链式栈的出栈

void DestroyStack(LinkStackNode** phead);//销毁链式栈

int LinkStackGetFront(LinkStackNode* head, LinkStackType* value);//获取链式栈栈顶元素
//linkstack.c

#include "linkstack.h"

#define HEAD printf("==================%s=================\n",__FUNCTION__);

LinkStackNode* creatStackNode(LinkStackType value)
{
  LinkStackNode* new_node = (LinkStackNode*)malloc(sizeof(LinkStackNode));
  new_node->data = value;
  new_node->next = NULL;

  return new_node;
}

void LinkStackInit(LinkStackNode** phead)//初始化链式栈
{
  if(phead == NULL)
  {
    return;
  }

  *phead = NULL;
  return;
}

void LinkStackPush(LinkStackNode** phead, LinkStackType value)//链式栈的入栈
{
  if(phead == NULL)
  {
    return;
  }

  LinkStackNode* tmp = *phead;
  (*phead) = creatStackNode(value);
  (*phead)->next = tmp;

  return;
}

void LinkStackPop(LinkStackNode** phead)//链式栈的出栈
{
  if(phead == NULL)
  {
    return;
  }
  if(*phead == NULL)
  {
    return;
  }

  LinkStackNode* to_delete = *phead;
  *phead = to_delete->next;
  free(to_delete);
  to_delete = NULL;

  return;
}

void DestroyStack(LinkStackNode** phead)//销毁链式栈
{
  if(phead == NULL)
  {
    return;
  }
  if(*phead == NULL)
  {
    return;
  }

  LinkStackNode* cur = *phead;

  while(cur != NULL)
  {
    LinkStackNode* to_delete = cur;
    cur = cur->next;
    free(to_delete);
    to_delete = NULL;
  }
  return;
}

int LinkStackGetFront(LinkStackNode* head, LinkStackType* value)//获取链式栈栈顶元素
{
  if(head == NULL)
  {
    return -1;
  }

  *value = head->data;
  return 1;
}

//测试代码如下

void LinkStackPrint(LinkStackNode* head, char* msg)
{
  printf("%s\n",msg);
  if(head == NULL)
  {
    return;
  }

  LinkStackNode* cur = head;
  while(cur != NULL)
  {
    printf("%c ",cur->data);
    cur = cur->next;
  }
  printf("\n");
}

void TestPush()
{
  HEAD;
  LinkStackNode* head;
  LinkStackInit(&head);
  LinkStackPush(&head, 'a');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'b');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'c');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'd');
  LinkStackPrint(head,"入栈一个元素");
}

void TestPop()
{
  HEAD;
  LinkStackNode* head;
  LinkStackInit(&head);
  LinkStackPush(&head, 'a');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'b');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'c');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'd');
  LinkStackPrint(head,"入栈一个元素");


  LinkStackPop(&head);
  LinkStackPrint(head,"出栈一个元素");
  LinkStackPop(&head);
  LinkStackPrint(head,"出栈一个元素");
  LinkStackPop(&head);
  LinkStackPrint(head,"出栈一个元素");
  LinkStackPop(&head);
  LinkStackPrint(head,"出栈一个元素");
  LinkStackPop(&head);
}

void TestGetFront()
{
  HEAD;
  LinkStackNode* head;
  LinkStackInit(&head);
  LinkStackPush(&head, 'a');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'b');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'c');
  LinkStackPrint(head,"入栈一个元素");
  LinkStackPush(&head, 'd');
  LinkStackPrint(head,"入栈一个元素");

  LinkStackType value;
  int ret = LinkStackGetFront(head,&value);
  printf("expected ret 1, actual %d\n",ret);
  printf("%c \n",value);
}

int main()
{
  TestPush();
  TestPop();
  TestGetFront();


  printf("\n");
  printf("\n");
  printf("\n");
  printf("\n");
  printf("\n");

  return 0;
}

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值