SqStack.h
#ifndef __SQSTACK_H__
#define __SQSTACK_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
#define STACK_SIZE 10
#define STACK_INCREAMENT 5
typedef struct sqstack
{
int *base;
int *top;
int len;
}SQSTACK,*PSQSTACK;
/* 初始化 */
Status init(PSQSTACK ps);
/* 销毁 */
Status destroy(PSQSTACK ps);
/* 重置 */
Status clear(PSQSTACK ps);
/* 判空 */
Boolean isEmpty(SQSTACK s);
/* 获取已存元素的数量 */
int listLen(SQSTACK s);
/* 获取栈顶元素 */
Status getTop(SQSTACK s,int *elem);
/* 入栈元素 */
Status push(PSQSTACK ps, int elem);
/* 出栈元素 */
int pop(PSQSTACK ps, int *elem);
/* 浏览栈中值 */
Status traverse(SQSTACK s, void (*vi)(int *));
#endif
SqStack.c
#include "SqStack.h"
/* 初始化 */
Status init(PSQSTACK ps)
{
ps->base = (int *)malloc(sizeof(int) * STACK_SIZE);
if(!ps->base)
{
printf("动态内存分配失败");
exit(-1);
}
ps->top = ps->base;
ps->len = STACK_SIZE;
return OK;
}
/* 销毁 */
Status destroy(PSQSTACK ps)
{
free(ps->base);
ps->base = NULL;
ps->top = NULL;
ps->len = 0;
return OK;
}
/* 重置 */
Status clear(PSQSTACK ps)
{
ps->top = ps->base;
}
/* 判空 */
Boolean isEmpty(SQSTACK s)
{
if(s.base == s.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 获取已存元素的数量 */
int listLen(SQSTACK s)
{
return s.top - s.base;
}
/* 获取栈顶元素 */
Status getTop(SQSTACK s,int *elem)
{
*elem = *(s.top-1);
return OK;
}
/* 入栈元素 */
Status push(PSQSTACK ps, int elem)
{
//判断栈是否满
if(ps->top - ps->base >= ps->len)
{
ps->base = (int *)realloc(ps->base, sizeof(int)*(ps->len + STACK_INCREAMENT) );
if(!ps->base)
{
printf("动态内存分配失败");
exit(-1);
}
ps->top = ps->base + ps->len;
ps->len += STACK_INCREAMENT;
}
*(ps->top++) = elem;
return OK;
}
/* 出栈元素 */
int pop(PSQSTACK ps, int* elem)
{
if(ps->base == ps->top)
{
return ERROR;
}
*elem = *(--ps->top);
return OK;
}
/* 浏览栈中值 */
Status traverse(SQSTACK s, void (*vi)(int *))
{
while(s.base != s.top)
{
vi(--s.top);
}
return OK;
}