.c文件
/***************************************
* author:贺永虎
* mail:xxxxxx
* desc:栈的线性实现函数
*
* **************************************/
#include "SqStack.h"
/*
return:
OK:表示初始化成功
OVERFLOW:表示初始化失败,内存未开成功
parm:
*S:表示要开辟的空间的线性表的地址
*/
int InitStack(SqStack *S)
{
S->base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if (!S->base)
exit(OVERFLOW);//存储分配失败
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;//存储分配成功
}
/*
return:
无
parm:
*S:要销毁的线性表
*/
void DestroyStack(SqStack *S)
{
S->top = NULL;
S->stacksize = 0;
free(S->base);
}
/*
return:
OK:表示清空栈成功
parm:
*S:要清空栈
*/
int ClearStack(SqStack *S)
{
S->top = S->base;
return OK;
}
/*
return:
ERROR:表示栈为空
TURE:表示栈不为空
parm:
*S:要判断栈是否为空
*/
int StackEmpty(SqStack *S)
{
if (S->top == S->base)
return ERROR;
else
return TRUE;
}
/*
return:
FALSE:表示查询栈的长度失败
否则 返回栈的长度
parm:
*S:查询栈的长度
*/
int StackLength(SqStack *S)
{
if (S->top == S->base)
return FALSE;
else
return (S->top - S->base);
}
/*
return:
FALSE:表示栈为空,没有栈顶元素
TRUE:表示返回栈顶元素成功
parm:
*S:要返回栈顶元素
*e:表示栈顶元素
*/
int GetTop(SqStack *S, ElemType *e)
{
if (S->top == S->base)
return FALSE;
else
*e = *(S->top - 1);
return TRUE;
}
/*
return:
FALSE:表示插入元素e为新的栈顶元素失败
OK:表示插入元素e为新的栈顶元素成功
parm:
*S:要插入元素e为新的栈顶元素失败
e:表示新插入栈顶的元素
*/
int Push(SqStack *S, ElemType e)
{
if (S->top - S->base >= STACK_INIT_SIZE)//如果栈的长度超过最大栈长,重新开辟空间
{
S->base = (ElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(ElemType));
if (!S->base)//如果开辟新空间失败,返回FALSE
{
return FALSE;
}
S->top = S->base + STACK_INIT_SIZE;
S->stacksize = S->stacksize + STACKINCREMENT;
}
*(S->top) = e;
(S->top)++;
return OK;
}
/*
return:
ERROR:表示栈为空,删除栈顶元素失败
OK:表示返回栈顶元素成功
parm:
*S:要删除栈顶元素
*e:表示删除栈顶元素
*/
int Pop(SqStack *S, ElemType* e)
{
if (S->top == S->base)
return ERROR;
else
{
S->top--;
*e = *(S->top);
return OK;
}
}
/*
return:
无
parm:
*S:遍历栈中元素
*/
void StackTraverse(SqStack *S)
{
if (S->base == NULL)
printf("ERROR\n");
if (S->top == S->base)
printf("栈中没有元素!");
ElemType *p;
p = S->top;
while (p > S->base)
{
p--;
printf("%d ", *p);
}
printf("\n");
}
.h文件
#ifndef SqStack_H
#define SqStack_H
#include <stdio.h>
#include <stdlib.h>
//定义宏常量
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//设置两个数据类型
typedef int ElemType;
typedef struct SqStack{//栈的顺序结构表示
ElemType *base; //栈底元素
ElemType *top; //栈顶元素
int stacksize; //栈的长度
}SqStack;
//如下为所有顺序表的函数声明
int InitStack(SqStack *S);//构造一个空栈S
void DestroyStack(SqStack *S);//销毁栈S,S不在存在
int ClearStack(SqStack *S);//清空栈S
int StackEmpty(SqStack *S);//判断栈S是否为空栈
int StackLength(SqStack *S);//求栈S的长度
int GetTop(SqStack *S, ElemType *e);//求栈顶元素
int Push(SqStack *S, ElemType e);//栈顶插入元素e
int Pop(SqStack *S, ElemType *e);//删除栈顶元素
void StackTraverse(SqStack *S);//遍历栈S
#endif // SqStack_H
main.c文件
#include "SqStack.h"
//如下为验证过程
void main()
{
SqStack S;
int stat = InitStack(&S);
if (stat == OVERFLOW)
{
printf("init error\n");
}
StackTraverse(&S);
Push(&S, 1);
Push(&S, 2);
Push(&S, 3);
Push(&S, 4);
Push(&S, 5);
StackTraverse(&S);
printf("栈的长度为:%d\n", StackLength(&S));
int a;
GetTop(&S, &a);
printf("Top = %d\n", a);
int b;
Pop(&S, &b);
GetTop(&S, &a);
printf("Top = %d\n", a);
StackTraverse(&S);
if(StackEmpty(&S)) printf("栈不为空;\n");
else printf("栈为空\n");
ClearStack(&S);
printf("栈的长度为:%d\n", StackLength(&S));
if(StackEmpty(&S)) printf("栈不为空;\n");
else printf("栈为空\n");
}
makefile文件
main:main.o SqStack.o
gcc -g main.o SqStack.o -o main
main.o:main.c SqStack.h
gcc -g -c main.c -o main.o
SqStack.o:SqStack.c SqStack.h
gcc -g -c SqStack.c -o SqStack.o
clean:
rm -fr *.o
rm -fr main