在上一篇博客中,我们介绍了栈的概念、特点,也用代码实现了顺序栈。在这篇博客中,我们将基于链表来实现栈,即链式栈。
linkstack.h:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
typedef char LinkStackType;
typedef struct LinkStack{
struct LinkStack* next;
LinkStackType data;
}LinkStack;
void LinkStackInit(LinkStack** phead);//初始化
void LinkStackDestroy(LinkStack** phead);//销毁
LinkStack* CreateNode(LinkStackType value);//创建新节点
void LinkStackPush(LinkStack** phead,LinkStackType value);//入栈
void LinkStackPop(LinkStack** phead);//出栈
int GetTop(LinkStack* head,LinkStackType* value);//取栈顶元素
void LinkStackPrint(LinkStack* head,const char* msg);//打印函数
linkstack.c:
#include "linkstack.h"
void LinkStackInit(LinkStack** phead){
if(phead == NULL){
return;
}
*phead = NULL;
}
void LinkStackDestroy(LinkStack** phead){
if(phead == NULL){
return;
}
LinkStack* cur = *phead;
for(;cur != NULL;cur = cur->next){
free(cur);
}
*phead = NULL;
}
LinkStack* CreateNode(LinkStackType value){
LinkStack* new_node = (LinkStack*)malloc(sizeof(LinkStack));
new_node->data = value;
new_node->next = NULL;
return new_node;
}
void LinkStackPrint(LinkStack* head,const char* msg){
printf("[%s]\n",msg);
LinkStack* cur = head;
for(;cur != NULL;cur = cur->next){
printf("[%c] ",cur->data);
}
printf("\n");
}
void LinkStackPush(LinkStack** phead,LinkStackType value){
if(phead == NULL){
return;
}
LinkStack* new_node = CreateNode(value);
new_node->next = *phead;
*phead = new_node;
}
void LinkStackPop(LinkStack** phead){
if(phead == NULL){
return;
}
if(*phead == NULL){
return;
}
LinkStack* to_delete = *phead;
*phead = (*phead)->next;
free(to_delete);
}
int GetTop(LinkStack* head,LinkStackType* value){
if(head == NULL){
return 0;
}
*value = head->data;
return 1;
}
test.c:
#include "linkstack.h"
#define PRINT_HEADER printf("\n============%s============\n",__FUNCTION__)
void test(){
PRINT_HEADER;
LinkStack* stack;
LinkStackInit(&stack);
LinkStackPrint(stack,"顺序栈的初始化");
LinkStackPush(&stack,'a');
LinkStackPush(&stack,'b');
LinkStackPush(&stack,'c');
LinkStackPush(&stack,'d');
LinkStackPrint(stack,"入栈四个元素");
LinkStackPop(&stack);
LinkStackPrint(stack,"出栈一个元素");
LinkStackPop(&stack);
LinkStackPrint(stack,"出栈两个元素");
LinkStackPop(&stack);
LinkStackPrint(stack,"出栈三个元素");
LinkStackPop(&stack);
LinkStackPrint(stack,"出栈四个元素");
LinkStackPop(&stack);
LinkStackPrint(stack,"尝试对空栈进行出栈操作");
LinkStackPush(&stack,'a');
LinkStackPush(&stack,'b');
LinkStackPush(&stack,'c');
LinkStackPush(&stack,'d');
LinkStackPrint(stack,"入栈四个元素");
LinkStackType value;
int ret=GetTop(stack,&value);
printf("top except d,actual %c\n",value);
LinkStackDestroy(&stack);
LinkStackPrint(stack,"销毁栈");
}
int main(){
test();
}
结果演示: