C语言实现基于顺序表的顺序栈
代码实现:
linkStack.h文件
#pragma once
#include<stddef.h>
typedef char linkType;
typedef struct linkNode
{
linkType data;
struct linkNode *next;
}linkNode;
linkNode *stackhead;
//初始化函数
void linkStackInit(linkNode **stackhead);
//销毁函数
void linkStackDestroy(linkNode **stackhead);
//入栈函数
void linkStackPush(linkNode **stackhead,linkType value);
//出栈函数
void linkStackPop(linkNode **stackhead);
//取栈顶元素函数
int linkStackGetTop(linkNode *stackhead,linkType *value);
linkStack.c文件
#include<stdio.h>
#include<stdlib.h>
#include"linkstack.h"
#define Test_Header printf("\n============%s============\n",__FUNCTION__);
linkNode *CreateNode(linkType value)
{
linkNode *new_node = (linkNode *)malloc(sizeof(linkNode));
new_node->data = value;
new_node->next = NULL;
return new_node;
}
//初始化函数
void linkStackInit(linkNode **stackhead)
{
if(stackhead == NULL)
{
//非法输入
return;
}
*stackhead = NULL;
}
//销毁函数
void linkStackDestroy(linkNode **stackhead)
{
if(stackhead == NULL)
{
//非法输入
return;
}
//循环遍历链式栈,释放每一个节点
linkNode *cur = *stackhead;
for(;cur != NULL;cur = cur->next)
{
free(cur);
}
*stackhead = NULL;
}
//入栈函数
void linkStackPush(linkNode **stackhead,linkType value)
{
if(stackhead == NULL)
{
//非法输入
return;
}
//每一次入栈操作就相当于链表的头插操作
linkNode *new_node = CreateNode(value);
new_node->next = *stackhead;
*stackhead = new_node;
}
//出栈函数
void linkStackPop(linkNode **stackhead)
{
if(stackhead == NULL)
{
//非法输入
return;
}
if(*stackhead == NULL)
{
//空栈
return;
}
//每一次出栈操作就相当于链表的头删操作
linkNode *to_delete = *stackhead;
*stackhead = to_delete->next;
free(to_delete);
}
//取栈顶元素函数
int linkStackGetTop(linkNode *stackhead,linkType *value)
{
if(stackhead == NULL)
{
//非法输入
return 0;
}
//相当于读取链表第一个节点的值
*value = stackhead->data;
return 1;
}
void Print(linkNode *stackhead,const char *msg)
{
printf("[%s]\n",msg);
if(stackhead == NULL)
{
//空栈
return;
}
linkNode *cur = stackhead;
for(;cur != NULL;cur = cur->next)
{
printf("%c ",cur->data);
}
printf("\n\n");
}
//以下为测试函数
void TestLinkStack()
{
Test_Header;
linkStackInit(&stackhead);
//入栈函数测试
linkStackPush(&stackhead,'a');
linkStackPush(&stackhead,'b');
linkStackPush(&stackhead,'c');
linkStackPush(&stackhead,'d');
Print(stackhead,"入栈四个元素:a b c d");
//出栈函数测试
linkStackPop(&stackhead);
linkStackPop(&stackhead);
Print(stackhead,"出栈两个元素");
linkStackPop(&stackhead);
linkStackPop(&stackhead);
Print(stackhead,"再出栈两次");
//取栈顶元素函数测试
linkStackPush(&stackhead,'a');
linkStackPush(&stackhead,'b');
Print(stackhead,"入栈两个元素:a b");
linkType value;
int ret = linkStackGetTop(stackhead,&value);
printf("expected top:b , actual top:%c\n",value);
printf("expected ret:1 , actual ret:%d\n",ret);
linkStackPop(&stackhead);
linkStackPop(&stackhead);
Print(stackhead,"将所有元素出栈");
ret = linkStackGetTop(stackhead,&value);
printf("expected ret:0 , actual ret:%d\n",ret);
}
//主函数调用测试函数
int main()
{
TestLinkStack();
return 0;
}
测试结果如下图: