#include <stdio.h>
#include <stdlib.h>
//定义函数结果状态码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//定义数据类型
typedef int ElemType ;
//定义程序返回状态类型
typedef int State;
//栈中结点的存储结构
typedef struct _StackNode
{
ElemType data;
struct _StackNode *next;//指向栈顶位置
}StackNode;
//声明链栈
//将头指针与栈顶指针结合
typedef struct _LinkStack
{
StackNode *top;//栈顶指针
int count;//栈长度
}LinkStack;
/*************************************************
Function: InitStack
Description: 初始化,构造空栈
Input: 链栈指针 LinkStack *stack
Output:
Return: 成功返回OK
Others: 空栈top为NULL,count=0
*************************************************/
State InitStack(LinkStack *stack)
{
stack->top = NULL;
stack->count = 0;
return OK;
}
/*************************************************
Function: IsStackEmpty
Description: 判断栈是否为空
Input: 链栈指针 LinkStack *stack
Output:
Return: 为空返回TRUE,否则返回FALSE
Others:
*************************************************/
State IsStackEmpty(LinkStack *stack)
{
if(stack->count == 0)
return TRUE;
else
return FALSE;
}
/*************************************************
Function: Push
Description: 入栈
Input: 链栈指针 LinkStack *stack
数据元素 ElemType e
Output:
Return: 成功返回OK,失败返回ERROR
Others: 新结点的next指向位置与单链表不同,是指向前一个
*************************************************/
State Push(LinkStack *stack, ElemType e)
{
StackNode *s = malloc(sizeof(StackNode));
if(s == NULL)
{
printf("Apply StackNode Failed!");
return FALSE;
}
//给新申请的结点赋值
s->data = e;
s->next = stack->top;
//更新链栈指针
stack->top = s;
stack->count++;
return OK;
}
/*************************************************
Function: Pop
Description: 出栈
Input: 链栈指针 LinkStack *stack
Output:
Return: 成功返回数据元素,否则程序退出
Others: 不要忘记释放出栈结点的空间
*************************************************/
ElemType Pop(LinkStack *stack)
{
//判断是否为空栈
if(stack->count == 0)
{
printf("The LinkStack is empty!");
exit(EXIT_FAILURE);
}
//保存栈顶指针
StackNode *s = stack->top;
//保存返回值
ElemType e = s->data;
//更新链栈指针
stack->top = s->next;
stack->count--;
//释放结点指针
free(s);
return e;
}
/*************************************************
Function: GetTop
Description: 取栈顶元素
Input: 链栈指针 LinkStack *stack
Output:
Return: 成功返回数据元素,否则程序退出
Others:
*************************************************/
ElemType GetTop(LinkStack *stack)
{
//判断是否为空栈
if(stack->top == 0)
{
printf("The stack is empty!");
exit(EXIT_FAILURE);
}
return stack->top->data;
}
/*************************************************
Function: ClearStack
Description: 把栈置空
Input: 链栈指针 LinkStack *stack
Output:
Return: 成功返回OK
Others:
*************************************************/
State ClearStack(LinkStack *stack )
{
StackNode *p,*q;
//p指向栈顶
p = stack->top;
while(p)
{
q = p;
p = p->next;
free(q);
}
stack->count = 0;
return OK;
}
/*************************************************
Function: GetLength
Description: 取得栈的长度
Input: 链栈指针 LinkStack *stack
Output:
Return: 返回栈的长度
Others:
*************************************************/
int GetLength(LinkStack *stack)
{
return stack->count;
}
数据结构C语言实现之链栈
最新推荐文章于 2022-03-27 11:27:38 发布