抽象数据类型、线性结构、递归实现:栈

来源:互联网 发布:c语言 long类型 编辑:程序博客网 时间:2024/05/21 10:51

数据的存储结构(物理结构):数据结构在计算机中的表示(又称映像)


数据:符号表示(人类)。

数据元素:基本单位(人)。


线性结构:一个数据元素的有序集合,元素与元素之间存在一对一的关系。

非线性结构:元素与元素之间存在一对多的关系。


栈和队列是线性结构,是抽象数据类型。



栈的抽象数据类型的定义如下:

ADT Stack{

        数据对象:(性质相同的数据元素的集合,是数据的一个子集)    { 15移动1班的所有学生 }

        数据关系:(数据元素之间的逻辑关系、逻辑结构)    学号大小

        基本操作:(构造一个空栈 S )void   InitStack(&S)

                            (销毁栈)DestroyStack(&S)

                             (清空栈)ClearStack(&S)

                             (判断空不空)StackEmpty(S)

                             (返回栈长度)StackLength(S) 

                             (用 e 返回栈顶元素)GetTop(S,&e) 

                             (插入元素e)Push(&S,e)

                              (删除栈顶)Pop(&S,&e)

                              (从栈底到栈顶,依次对每个元素调用函数visit())StackTraverse(S,visit())

}

栈有两种存储表示方法:

(1)顺序栈(利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,指针top始终在栈顶元素的下一个位置上

定义:

#define  STACK_INCREMENT 10;      


typedef struct{

SElemType  *base;

SElemType  *top;

int    stacksize;

}SqStack;


注:SElemType意思是栈的数据元素的类型,stacksize为栈的当前可使用的最大空间容量。

优点:可在应用的过程中,当栈的容量不够用时,再stacksize加上常量STACK_INCREMENT,以逐步扩大。

                                                                                       

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//插入栈顶元素的代码如下:

int  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);     //如果存储分配失败,退出该方法,并返回OVERFLOW的值给主调进程

                 S.stacksize + = STACK_INCREMENT;

      }

      //将e值赋给 top 所指的元素*top,top再加一

     *top ++ = e ;

     return  OK;

}

注:(1)exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib,声明为void exit(int value);
exit的功能为,退出当前运行的程序,并将参数value返回给主调进程。

(2)OVERFLOW为math.h中的一个宏定义,其值为3。含义为运算过程中出现了上溢,即运算结果超出了运算变量所能存储的范围。

(3)realloc(旧的首地址,位大小),返回 新的存储空间的 首地址。

(4)根据 优先级(前缀>中缀>后缀), *top ++ = e 可分为两个代码段:*top = e 和 top++ 。

//删除并取出栈顶元素的值,代码如下:

int   Pop(qStack  &S,SElemType  &e){

          if(S.top==S.base)  

                   return  ERROR;

          e = * - - S.top;                  //如果栈不为空,通过top =top-1操作,以删除栈顶元素,再将top所指元素的值 赋予 e 。

          return OK;

}



(2)链栈








原创粉丝点击