数据结构:链栈的基本操作

简介:使用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;
}

程序运行结果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值