实现了一下顺序栈,文件是分开调用的
StartDefine.h文件
/**********************************************
文件位置:1 绪论\StartDefine
文件名称:StartDefine
文件类型:.h
文件内容:相关宏函数以及结果状态码的定义
**********************************************/
//#ifndef STARTDEFINE_H
//#define STARTDEFINE_H
//函数头文件
#include
#include
#include
#include
#include
#include
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
//#endif
SequenceStack.h文件
/**************************************
文件位置:3 栈和队列\SequenceStack
文件名称:SequenceStack
文件类型:.h
实现功能:栈的顺序存储结构
***************************************/
//#ifndef SEQUENCESTACK_H
//#define SEQUENCESTACK_H
#define STACK_INIT_SIZE 100//初始分配量
#define STACK_INCREMENT 10 //分配增量
typedef struct
{
SElemType *base;//栈底指针,构造栈和销毁栈之后,base的值都为null
SElemType *top;//栈顶指针,指向栈顶元素的下一个位置
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
//构造一个新的空栈 S
Status InitStack(SqStack &S);
//销毁栈S,S不再存在
Status DestroyStack(SqStack &S);
//把S设为空栈
Status ClearStack(SqStack &S);
//判断栈是否为空
Status StackEmpty(SqStack &S);
//返回栈中元素个数
int StackLength(SqStack S);
//用e返回栈顶元素
Status GetTop(SqStack S,SElemType &e);
//插入元素e为新的栈顶元素
Status Push(SqStack &S,SElemType e);
//删除栈顶元素,并用e返回其值
Status Pop(SqStack &S,SElemType &e);
//对栈中每个元素调用函数visit(),一旦失败则操作失败
Status StackTraverse(SqStack S,void(*visit)(SElemType));
//#endif
SequenceStack.cpp文件
/**************************************
文件位置:3 栈和队列\SequenceStack
文件名称:SequenceStack
文件类型:cpp文件
实现功能:顺序栈相关函数基本操作
***************************************/
//#ifndef SEQUENCESTACK_C
//#define SEQUENCESTACK_C
//#include"SequenceStack.h"
//构造一个新的空栈 S
Status InitStack(SqStack &S){
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base;//初始时栈顶指针指向栈底指针,也是栈空的标志
S.stacksize=STACK_INIT_SIZE;
return OK;
}
//销毁栈S,S不再存在
Status DestroyStack(SqStack &S){
if(!S.base) return ERROR;//栈未建立
free(S.base);//回收栈空间
S.base=S.top=NULL;//区别置空
S.stacksize=0;
return OK;
}
//把S设为空栈
Status ClearStack(SqStack &S){
if(!S.base) return ERROR;
S.top=S.base;
return OK;
}
//判断栈是否为空
Status StackEmpty(SqStack &S){
if(S.base==S.top)
return OK;
else
return ERROR;
}
//返回栈中元素个数
int StackLength(SqStack S){
return S.top-S.base;
}
//用e返回栈顶元素
Status GetTop(SqStack S,SElemType &e){
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}
//插入元素e为新的栈顶元素
Status Push(SqStack &S,SElemType e){
if(S.top-S.base>=S.stacksize){
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACK_INCREMENT;
}
*S.top++=e;
return OK;
}
//删除栈顶元素,并用e返回其值
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
Status StackTraverse(SqStack S,void(*visit)(SElemType)){
SElemType *p=S.base;
while(p
visit(*p++);
return OK;
}
//#endif
SequenceStack-Test.cpp文件
/**************************************
文件位置:3 栈和队列\SequenceStack
文件名称:SequenceStack-Test cpp文件
实现功能:顺序栈相关函数的测试
***************************************/
typedef int SElemType;
#include"..\..\1 绪论\StartDefine\StartDefine.h"
#include"SequenceStack.h"
#include"SequenceStack.cpp"
int main(){
SqStack S;
int i;
SElemType e;
void PrintElem(SElemType e);
printf("函数InitStack测试……\n");
printf("初始化顺序栈S…\n");
InitStack(S);
printf("\n");
printf("函数StackEmpty测试……\n");
StackEmpty(S)?printf("S为空!!!\n"):printf("S不为空!!!\n");
printf("\n");
printf("函数Push测试……\n");
for(i=1;i<=6;i++){
printf("将\"%d\"压入栈S",2*i);
Push(S,2*i);
printf("(累计第%d个元素)\n",S.top-S.base);
}
printf("\n");
printf("函数StackTraverse测试……\n");
StackTraverse(S,PrintElem);
printf("\n\n");
printf("函数Pop测试……\n");
Pop(S,e);
printf("栈顶元素\"%d\"出栈\n",e);
printf("S中的元素为:S=");
StackTraverse(S,PrintElem);
printf("\n\n");
printf("函数Stacklength测试……\n");
printf("S的长度为%d\n",StackLength(S));
printf("\n");
printf("函数GetTop测试……\n");
GetTop(S,e);
printf("栈顶元素的值为\"%d\"\n",e);
printf("\n");
printf("函数ClearStack测试……\n");
printf("清空S前:");
StackEmpty(S)?printf("S为空!!!\n"):printf("S不为空!!!\n");
ClearStack(S);
printf("清空S后:");
StackEmpty(S)?printf("S为空!!!\n"):printf("S不为空!!!\n");
printf("\n");
printf("函数DestroyStack测试……\n");
printf("销毁S前:");
S.base!=NULL&&S.top!=NULL?printf("S为空!!!\n"):printf("S不为空!!!\n");
DestroyStack(S);
printf("销毁S前:");
S.base!=NULL&&S.top!=NULL?printf("S为空!!!\n"):printf("S不为空!!!\n");
printf("\n");
return 0;
}
//定义一个输出函数
void PrintElem(SElemType e){
printf("%d ",e);
}
后续的再更新……