上篇博客我们已经对栈的基本操作有了介绍,现在我们利用链表的方式来实现一下栈的基本操作。
其实利用链表更好实现栈,因为我们链表的头插与头删恰好可以与栈相对应,先进的后出,这里我们就不过多的赘述,直接进行实现即可。
//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;
}
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!