I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

【sstack.h】

/*******************************************************************************
/* <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.cpp】

/*******************************************************************************
/* <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.basereturn 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.basereturn 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);
}
posted on 2011-04-05 14:47  jcsu  阅读(539)  评论(1编辑  收藏  举报