Stack.h:结构定义和函数申明
#ifndef __STACK_H__
#define __STACK_H__
//一些库函数的头文件包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
//自定义bool
typedef int Boolean;
//定义函数返回状态
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef struct Node
{
int data;
struct Node *next;
}LNode,*PNode;
typedef struct stack
{
LinkList base; //栈基址 ,栈底
LinkList top; // 栈顶
int len;
}STACK,*PSTACK;
/* 初始化 */
Status init(PSTACK ps);
/* 销毁 */
Status destroy(PSTACK ps);
/* 重置 */
Status clear(PSTACK ps);
/* 判空 */
Boolean isEmpty(STACK s);
/* 获取已存元素的数量 */
int listLen(STACK s);
/* 获取栈顶元素 */
Status getTop(STACK s,int *elem);
/* 入栈元素 */
Status push(PSTACK ps, int elem);
/* 出栈元素 */
int pop(PSTACK ps, int* elem);
/* 浏览栈中值 */
Status traverse(STACK s, void (*vi)(int));
#endif
Stack.c :基本函数实现
#include "Stack.h"
/* 初始化 */
Status init(PSTACK ps)
{
ps->base = (PNode)malloc(sizeof(LNode));
if(!ps->base)
{
printf("动态内存分配失败");
exit(-1);
}
ps->base->next=NULL;
ps->top = ps->base;
ps->len = 0;
return OK;
}
/* 重置 */
Status clear(PSTACK ps)
{
PNode p,q;
if(ps->top != ps->base) //不是空栈
{
p = ps->top->next;
ps->top->next = NULL;//将头结点和第一个结点断开
while(p)
{
q = p->next;
free(p);
p = q;
}
ps->base = ps->top;
ps->len = 0;
}
return OK;
}
/* 销毁 */
Status destroy(PSTACK ps)
{
clear(ps);
free(ps->top);
ps->top = NULL;
ps->base = NULL;
ps->len = 0;
return OK;
}
/* 判空 */
Boolean isEmpty(STACK s)
{
if(s.base == s.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 获取已存元素的数量 */
int listLen(STACK s)
{
return s.len;
}
/* 获取栈顶元素 */
Status getTop(STACK s,int *elem)
{
PNode p;
if(!isEmpty(s))
{
p = s.top->next;
*elem = p->data;
return OK;
}
else
{
return ERROR;
}
}
/* 入栈元素 */
Status push(PSTACK ps, int elem)
{
PNode p = ps->top;
PNode newNode = (PNode)malloc(sizeof(LNode));
newNode->data = elem;
newNode->next = p->next;
p->next = newNode;
if(ps->top == ps->base)
{
ps->base = newNode;
}
ps->len++;
return OK;
}
/* 出栈元素 */
int pop(PSTACK ps, int *elem)
{
PNode q,p = ps->top; //头结点
if(p->next)
{
q = p->next; //首结点
*elem = q->data;
p->next = q->next;
free(q);
if(p->next ==NULL)
{
ps->base = ps->top;
}
q = NULL;
return OK;
}
else
{
return ERROR;
}
}
/* 浏览栈中值 */
Status traverse(STACK s, void (*vi)(int))
{
PNode p = s.top->next;
while(p)
{
vi(p->data);
p = p->next;
}
return OK;
}