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

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

 

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

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

 

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

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

 

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

 


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

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)链栈

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值