【sstack.h】
/*******************************************************************************
/* <PRE>
/* <PRE>
/* 版权所有 : -
/* 模块名 : 栈和队列
/* 文件名 : sstack.h
/* 功能描述 : 顺序栈的表示与实现
/* 作者 : xxx
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 xxx 创建
/* </PRE>
*******************************************************************************/
#ifndef __SEQUENCE_STACK_H__
#define __SEQUENCE_STACK_H__
typedef int Status;
typedef int ElemType;
typedef int SElemType;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
/******************************************************************************
/* 数据结构声明
/******************************************************************************/
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
/* 栈的顺序存储表示 */
typedef struct {
SElemType *base; //在栈构造之前和销毁之后, base的值为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间, 以元素为单位
}SqStack;
/******************************************************************************
/* 函数原型声明
/******************************************************************************/
Status InitStack(SqStack &S); //构造一个空栈S
Status DestroyStack(SqStack &S); //销毁S, S不再存在
Status ClearStack(SqStack &S); //把S置为空
Status StackEmpty(SqStack S); //若栈S为空, 再返回TRUE, 否则返回FALSE
int StackLength(SqStack S); //返回S的元素个数, 即栈的长度
Status GetTop(SqStack S, SElemType &e);//若栈不空, 则用e返回S的栈顶元素, 并返回OK; 否则返回ERROR
Status Push(SqStack &S, SElemType e); //插入元素e为新的栈顶元素
Status Pop(SqStack &S, SElemType &e); //若栈不空, 则删除S的栈顶元素, 用e返回其值, 并返回OK; 否则返回ERROR
Status StackTraverse(SqStack S, Status (*visit)()); //从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit失败, 则操作失败
#endif //__SEQUENCE_STACK_H__
/* 模块名 : 栈和队列
/* 文件名 : sstack.h
/* 功能描述 : 顺序栈的表示与实现
/* 作者 : xxx
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 xxx 创建
/* </PRE>
*******************************************************************************/
#ifndef __SEQUENCE_STACK_H__
#define __SEQUENCE_STACK_H__
typedef int Status;
typedef int ElemType;
typedef int SElemType;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
/******************************************************************************
/* 数据结构声明
/******************************************************************************/
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
/* 栈的顺序存储表示 */
typedef struct {
SElemType *base; //在栈构造之前和销毁之后, base的值为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间, 以元素为单位
}SqStack;
/******************************************************************************
/* 函数原型声明
/******************************************************************************/
Status InitStack(SqStack &S); //构造一个空栈S
Status DestroyStack(SqStack &S); //销毁S, S不再存在
Status ClearStack(SqStack &S); //把S置为空
Status StackEmpty(SqStack S); //若栈S为空, 再返回TRUE, 否则返回FALSE
int StackLength(SqStack S); //返回S的元素个数, 即栈的长度
Status GetTop(SqStack S, SElemType &e);//若栈不空, 则用e返回S的栈顶元素, 并返回OK; 否则返回ERROR
Status Push(SqStack &S, SElemType e); //插入元素e为新的栈顶元素
Status Pop(SqStack &S, SElemType &e); //若栈不空, 则删除S的栈顶元素, 用e返回其值, 并返回OK; 否则返回ERROR
Status StackTraverse(SqStack S, Status (*visit)()); //从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit失败, 则操作失败
#endif //__SEQUENCE_STACK_H__
【sstack.cpp】
/*******************************************************************************
/* <PRE>
/* <PRE>
/* 版权所有 : -
/* 模块名 : 栈和队列
/* 文件名 : sstack.cpp
/* 功能描述 : 顺序栈的表示与实现
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "sstack.h"
/*******************************************************************************
/* <FUNC>
/* 函数名 : InitStack
/* 功能 : 构造空栈
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : GetTop
/* 功能 : 获取栈顶元素
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈不空, 则用e返回S的栈顶元素, 并返回OK; 否则返回ERROR
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 入栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 插入元素e为新的栈顶元素
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) { //栈满, 追加存储空间
S.base = (ElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) *\
sizeof(ElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 出栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈不空, 则删除S的栈顶元素, 用e返回其值, 并返回OK; 否则返回ERROR
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
/* 模块名 : 栈和队列
/* 文件名 : sstack.cpp
/* 功能描述 : 顺序栈的表示与实现
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "sstack.h"
/*******************************************************************************
/* <FUNC>
/* 函数名 : InitStack
/* 功能 : 构造空栈
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : GetTop
/* 功能 : 获取栈顶元素
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈不空, 则用e返回S的栈顶元素, 并返回OK; 否则返回ERROR
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 入栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 插入元素e为新的栈顶元素
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) { //栈满, 追加存储空间
S.base = (ElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) *\
sizeof(ElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : Push
/* 功能 : 出栈
/* 参数 : -
/* 返回值 : -
/* 备注 : 若栈不空, 则删除S的栈顶元素, 用e返回其值, 并返回OK; 否则返回ERROR
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
【test.cpp】
/*******************************************************************************
/* <PRE>
/* 版权所有 : -
/* 模块名 : -
/* 文件名 : test.cpp
/* 功能描述 : 功能测试
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include "sstack.h"
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
SqStack S; SElemType e;
InitStack(S);
Push(S, 10);
Push(S, 20);
Push(S, 30);
GetTop(S, e); printf("%d\n", e);
Pop(S, e); printf("%d\n", e);
Pop(S, e); printf("%d\n", e);
Pop(S, e); printf("%d\n", e);
}
/* <PRE>
/* 版权所有 : -
/* 模块名 : -
/* 文件名 : test.cpp
/* 功能描述 : 功能测试
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : -
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include "sstack.h"
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
SqStack S; SElemType e;
InitStack(S);
Push(S, 10);
Push(S, 20);
Push(S, 30);
GetTop(S, e); printf("%d\n", e);
Pop(S, e); printf("%d\n", e);
Pop(S, e); printf("%d\n", e);
Pop(S, e); printf("%d\n", e);
}