数据结构之栈

数据结构之栈的实现代码如下:
//=====================================================================================
//sheadd.h
#define TRUE            
#define FALSE            0
#define OK               1      //成功
#define ERROR            0      //失败(错误)
#define INFEASIBLE      -1      //不可行的
#define OVERFLOW        -2      //(内存)溢出
#define UNDERFLOW       -4      //(数组下标)下溢
#define ENDELEM         -9999   //序列结束元素(为方便演示而设)
#define STACK_INIT_SIZE 20      // 存储空间初始分配量
#define STACKINCREMENT  2       // 存储空间分配增量
typedef int SElemType;          // 定义栈元素类型
typedef int Status;             //定义类型int为Status,即给int取一别名Status
struct SqStack
{
    SElemType *base;            // 在栈构造之前和销毁之后,base的值为NULL
    SElemType *top;             // 栈顶指针
    int stacksize;              // 当前已分配的存储空间,以元素为单位
}; // 顺序栈
//================================================================================ 


//=================================================================================
#include
#include
#include "sheadd.h"



 Status InitStack(SqStack &S)
 
     // 构造一个空栈S
    if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
        exit(OVERFLOW); // 存储分配失败
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;  //stacksize指示栈的大小
    return OK;
 }

 Status DestroyStack(SqStack &S)
 { // 销毁栈S,S不再存在
   free(S.base);
   S.base=NULL;
   S.top=NULL;
   S.stacksize=0;
   return OK;
 }



 Status ClearStack(SqStack &S)
 { // 把S置为空栈,不删除元素
   S.top=S.base;
   return OK;
 }


 Status StackEmpty(SqStack S)
 { // 若栈S为空栈,则返回TRUE,否则返回FALSE
   if(S.top==S.base)
     return TRUE;
   else
     return FALSE;
 }

 int StackLength(SqStack S)
 { // 返回S的元素个数,即栈的长度
   return S.top-S.base;
 }

 Status GetTop(SqStack S,SElemType &e)
 { // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
   if(S.top>S.base)
   {
     e=*(S.top-1);  //top指向栈顶元素的上一个
     return OK;
   }
   else
     return ERROR;
 }

 Status Push(SqStack &S,SElemType e)
 { // 插入元素e为新的栈顶元素
   if(S.top-S.base>= S.stacksize) // 栈满,追加存储空间
   {
     S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
     if(!S.base)
       exit(OVERFLOW); // 存储分配失败
     S.top=S.base + S.stacksize;
     S.stacksize += STACKINCREMENT;
   }
   *(S.top)++=e;
   return OK;
 }

 Status Pop(SqStack &S,SElemType &e)
 { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
   if(S.top==S.base)
     return ERROR;
   e=*--S.top;
   return OK;
 }

 Status StackTraverse(SqStack S,Status(*visit)(SElemType))
 { // 从栈底到栈顶依次对栈中每个元素调用函数visit()。
   // 一旦visit()失败,则操作失败
   while(S.top> S.base)
     visit(*S.base++);
   printf("\n");
   return OK;
 }
 

 Status visit(SElemType c)
 {
   printf("%d ",c);
   return OK;
 }


 void main()
 {
   int j;
   SqStack s;
   SElemType e;
   if(InitStack(s)==OK)
     for(j=1;j<= 12;j++)
       Push(s,j);
   printf("栈中元素依次为:");
   StackTraverse(s,visit);
   Pop(s,e);
   printf("弹出的栈顶元素 e=%d\n",e);
   printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
   GetTop(s,e);
   printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
   ClearStack(s);
   printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
   DestroyStack(s);
   printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
 }
//====================================================================================
posted @ 2014-04-12 10:40  dreamsyeah  阅读(151)  评论(0编辑  收藏  举报