简介:使用C语言实现链栈的基本操作,并且测试了程序的正确性。
头文件LinkStack.h:包括数据类型定义,函数声明
#ifndef LINK_STACK_H
#define LINK_STACK_H
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 10
typedef int SElemType;
typedef enum{
FALSE,
TRUE
}BOOL;
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct
{
LinkStackPtr top;
int count;
}LinkStack;
void InitStack(LinkStack *S);
BOOL ClearStack(LinkStack *S);
BOOL StackEmpty(LinkStack S);
int StackLength(LinkStack S);
BOOL GetTop(LinkStack S, SElemType *e);
BOOL Push(LinkStack *S, SElemType e);
BOOL Pop(LinkStack *S, SElemType *e);
#endif
源文件LinkStack.c:基本操作的C语言实现
#include "LinkStack.h"
/********************************************************************************
@brief 初始化链栈
@param S:链栈的地址
@retval void
@note void
*********************************************************************************/
void InitStack(LinkStack *S)
{
S->top = NULL; //栈顶设置为空
S->count = 0; //栈长设置为0
}
/********************************************************************************
@brief 销毁链栈
@param S:链栈的地址
@retval TRUE :操作成功
FALSE:操作失败
@note void
*********************************************************************************/
BOOL ClearStack(LinkStack *S)
{
StackNode *p,*q;
p = S->top; //q指向栈顶
while (p) //依次释放栈中的结点
{
q = p;
p = p->next;
free(q);
}
S->count = 0; //栈长设置为0
return TRUE;
}
/********************************************************************************
@brief 判断链栈空
@param S:链栈
@retval TRUE :操作成功
FALSE:操作失败
@note void
*********************************************************************************/
BOOL StackEmpty(LinkStack S)
{
return (BOOL)(S.count == 0);
}
/********************************************************************************
@brief 获取链栈的长度
@param S:链栈
@retval 链栈的长度
@note void
*********************************************************************************/
int StackLength(LinkStack S)
{
return S.count;
}
/********************************************************************************
@brief 获取链栈栈顶元素值
@param S:链栈
@retval 链栈的长度
@note void
*********************************************************************************/
BOOL GetTop(LinkStack S, SElemType *e)
{
if (S.top ==NULL){ //栈空,返回错误信息
return FALSE;
}
else{
*e = S.top->data; //获取栈顶指针原始值
}
return TRUE;
}
/********************************************************************************
@brief 压栈
@param S:链栈的地址
e:压栈元素数值
@retval TRUE :操作成功
FALSE:操作失败
@note void
*********************************************************************************/
BOOL Push(LinkStack *S, SElemType e)
{
StackNode *s = (StackNode *)malloc(sizeof(StackNode));
s->data = e;
s->next = S->top;
S->top = s;
S->count++;
return TRUE;
}
/********************************************************************************
@brief 出栈
@param S:链栈的地址
e:出栈元素数值
@retval TRUE :操作成功
FALSE:操作失败
@note void
*********************************************************************************/
BOOL Pop(LinkStack *S, SElemType *e)
{
StackNode *p;
if (StackEmpty(*S)){ //栈空,返回错误信息
return FALSE;
}
*e = S->top->data; //获取栈顶元素值
p = S->top; //栈顶指针赋值给p
S->top = S->top->next; //栈顶指针指向下一个结点
free(p); //释放栈顶结点
S->count--; //栈长减1
return TRUE;
}
主函数main.c:测试基本操作程序的正确性
/***************************************头文件***********************************/
#include "stdio.h"
#include "stdlib.h"
#include "LinkStack.h"
/**********************************宏定义及类型定义******************************/
/************************************定义全局变量********************************/
#define PUSH_ELEMENT_NUMBER MAXSIZE
/********************************************************************************
@brief 打印栈中所有元素
@param S:顺序栈
@retval TRUE :操作成功
FALSE:操作失败
@note void
*********************************************************************************/
BOOL PrintLinkStackAllElem(LinkStack S)
{
StackNode *p;
p = S.top;
if (p == NULL){
printf("空栈,无法打印\n");
return FALSE;
}
while (p)
{
printf("栈结点元素值为%d\n", p->data);
p = p->next;
}
return TRUE;
}
/*************************************函数声明***********************************/
void TestLinkStack(void)
{
int i;
SElemType e;
LinkStack S;
printf("初始化栈链...\n");
InitStack(&S);
printf("\n正在压入%d个元素...\n", PUSH_ELEMENT_NUMBER);
for (i = 0; i < PUSH_ELEMENT_NUMBER; i++){
Push(&S, i+1);
}
printf("\n打印栈中所有元素...\n");
PrintLinkStackAllElem(S);
printf("\n弹出一个元素...\n");
if (Pop(&S, &e)){
printf("弹出成功\n");
}
else{
printf("弹出失败\n");
}
printf("\n打印栈中所有元素...\n");
PrintLinkStackAllElem(S);
printf("\n打印栈顶元素...\n");
if (GetTop(S, &e)){
printf("获取成功,获取元素值为%d\n", e);
}
else{
printf("获取失败\n");
}
printf("\n销毁链栈...\n");
ClearStack(&S);
}
/********************************************************************************
@brief 主函数
@param void
@retval void
@note void
*********************************************************************************/
int main(void)
{
TestLinkStack();
system("pause");
return 0;
}
程序运行结果: