数据结构--03栈

125 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天

定义和特点

定义

受约束的线性表,只允许栈顶元素入栈和出栈

特点

栈又称为后进先出的线性表,简称LIFO结构。

对栈来说,表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空栈

先进后出,后进先出

表示

类型定义

栈也有两种存储表示方法,分别称为顺序栈和链栈。

抽象数据类型定义

ADT 栈(stack) Data 同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。 Operation{ InitStack(&S): 初始化操作,建立一个空栈s。 DestroyStack(&S): 若栈存在,则销毁它。 ClearStack(&S): 将栈清空。 StatckEmpty(S): 若栈存在且非空,返回true,否则返回false。 GetTop(S,&e): 若栈存在且非空,用e返回S的栈顶元素。 Push(&S,e): 若栈S存在,插入新元素e到栈S中并成为其栈顶对象。 Pop(&S,&e): 删除栈S中的栈顶元素,并用e返回其值。 StackLength(S): 返回栈S的元素个数。 StackTraverse(S,visit()): 栈S已存在且非空。从栈底到栈顶依次对S的每个数据元素调用visit()。

}endADT

顺序栈

存储结构

 #define MAXSIZE 100         //顺序栈存储空间的初始分配址
 ​
 typedef struct{
     SElemType *base;        //栈底指针
     SElemType *top;         //栈顶指针
     int stacksize;          //栈可用的最大容扯
 }SqStack;
 //top 指栈顶元素后一位置
 //S.top == 0时,栈空
 //S.top == stacksize 时,栈满

基本操作

 //栈的初始化:
 Status InitStack(SqStack &S){
     S.base=(SElemtype *)malloc(STACK_INIT_SIZE*sizeof(SElemtype));
     if(!S.base)                                     //如果base的值为空,则表明结构体不存在
         return(OVERFLOW);
     S.top=S.base;                                //(top=base 可作为栈为空的标记)
     S.stacksize=STACK_INIT_SIZE;   //按照初始分配量进行第一次存储分配
     return OK;
 }
 ​
 //栈的销毁:
 Status DestoryStack(SqStack &S)
 {
     free(S.base);
     S.base = NULL;
     S.top = NULL;
     S.stacksize = 0;
     return OK;
 }
 ​
 //栈的清空:
 ​
 Status ClearStack(SqStack &S)
 {
     S.top = S.base;
     return OK;
 }
 ​
 // 判断栈是否为空:
 ​
 Status StackEmpty(SqStack S)
 {
     if(S.top == S.base)
         return TRUE;
     else
         return FALSE;
 }
 ​
 // 返回栈顶元素:
 ​
 Status GetTop(SqStack S,SElemType &e)
 {
     if(S.top == S.base) 
         return ERROR;
     e = *(S.top -1);
     return OK;
 }
 ​
 //压栈:
 ​
 Status Push(SqStack &S, SElemType 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)
 {
     if(S.top == S.base) return ERROR;
     e = * --S.top;
     return OK;
 }
 ​
 //栈的元素个数:
 ​
 int StackLength(SqStack S)
 {
     return S.top - S.base;
 ​
 //栈元素从栈底依次输出:
 ​
 Status StackTraverse(SqStack S, Status(* visit)(SElemType))
 {
     while(S.top > S.base)
         visit(*S.base++);
     printf("\n");
     return OK;
 }
 ​
 Status visit(SElemType e)
 {
     printf("%d ", e);
     return OK;
 }

链栈

存储结构

 typedef struct {        
 ​
     SElemType data[MAXSIZE]; 
 ​
        int top; *// 用于栈顶指针* 
 ​
  }SqStack;

基本操作

 //栈的初始化:
 Status InitStack(SqStack &S)
 { 
         /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
         S.top=-1;
         return OK;
 ​
 //栈的清空:
 Status ClearStack(SqStack &S)
 { 
         S.top=-1;
         return OK;
 }
 ​
 //判断栈是否为空:
 Status StackEmpty(SqStack S)
 { 
         if (S.top==-1)
                 return TRUE;
         else
                 return FALSE;
 }
 ​
 //返回栈顶元素:
 Status GetTop(SqStack S,SElemType &e)
 {
         if (S.top==-1)
                 return ERROR;
         else
                 e=S.data[S.top];
         return OK;
 }
 ​
 //压栈:
 Status Push(SqStack &S,SElemType e)
 {
         if(S.top == MAXSIZE -1) 
         {
                 return ERROR;
         }
         S.top++;                //栈顶指针增加一 
         S.data[S.top]=e;  //将新插入元素赋值给栈顶空间
         return OK;
 }
 ​
 //出栈:
 Status Pop(SqStack &S,SElemType &e)
 { 
         if(S.top==-1)
                 return ERROR;
         e=S.data[S.top];    
         S.top--;            
         return OK;
 }
 ​
 //栈的元素个数:
 int StackLength(SqStack S)
 { 
         return S.top+1;
 }
 ​
 //栈元素从栈底依次输出:
 Status visit(SElemType c)
 {
         printf("%d ",c);
         return OK;
 }
 ​
 Status StackTraverse(SqStack S)
 {
         int i;
         i=0;
         while(i<=S.top)
         {
                 visit(S.data[i++]);
         }
         printf("\n");
         return OK;
 }

\