超难的数据结构之栈实现

  • 前言
  • 栈的定义和特点
    • 栈的类型定义
    • 栈的函数实现
  • 总结


前言

栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表不相同的两类重要的抽象数据类型。


提示:以下是本篇文章正文内容

栈的定义和特点

栈是限定仅在表尾进行插入或者删除操作的线性表。因此,对栈来说,表尾端有特殊含义,称为栈顶,相应的,表头端称为栈底。不含元素的空表称为空栈。
假如栈S=(a1,a2,…an),则称a1为栈底元素,an 为栈顶元素。栈中元素按a1,a2, … an的次序进栈,退栈的第一个元素 应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的
超难的数据结构之栈实现_第1张图片

超难的数据结构之栈实现_第2张图片

栈的类型定义

栈的基本操作有入栈,出栈,栈的初始化,栈空的判定以及取栈顶元素等。

顺序栈的表示和实现:

顺序栈是指利用顺序存储结构实现的栈,即利用一组地址 连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,另设指针base指示栈顶元素在顺序栈中的位置。通常以top和base的值相等时,表示为空栈。

#define MAXSIZE 100     //顺序栈储存空间的初始分配量
typef struct{
     
    int *base   //栈底指针
    int *top    //栈顶指针
    int  stacksize  //栈可用的最大容量
 }SqStack   

注:base为栈底指针,初始化完成后,栈底指针base始终指向栈底的位置,若base的值为null,则表明栈不存在。top为栈顶指针,其初始值指向栈底。每当插入新的栈顶元素,指针top +1;删除栈顶元素,指针top-1。栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的下位
栈的抽象数据类型定义:

基本操作:
 InitStack(&S)
   操作结果:构造一个空栈S.
  GetTop (S)
   初始条件:栈s已存在且非空。
   操作结果:返回s的栈顶元素,不修改栈顶指针。
  Push(&S,e)
   初始条件:栈s已存在。
   操作结果:插人元素e为新的栈顶元素。
  Pop(&S, &e)
   初始条件:栈s已存在且非空。
   操作结果:删除s的栈顶元素,并用e返回其值。
 

栈的函数实现

顺序栈的初始化

Status InitStack(SqStack &s)
{
     
   S.base=new SElemType [MAXSIZE];
   if(!S.base) exit(OVERFLOW);
   S.top=S.base;
   S.stacksize=MAXSIZE;
   return OK;

入栈:在栈顶插入一个新元素

Status Push(SqStack &S,int e)
{
     
   if(S.top-S.base==S.stacksize)
   return ERROR;
   *S.top++=e;
   return OK;
}   

出栈:将栈顶元素删除

Status Pop(SqStack &S,int &e)
{
     
  if(S.top=S.base)
  return ERROR;
  e=*--S.top;
  return OK;
}  

取栈顶元素:当栈非空时,此操作返回当前栈顶元素的值,栈顶元素保持不变

SElemType GetTop(SqStack S)
{
     
  if(S.top!=S.base)
  return *(S.top-1);
}  

总结

只写一些栈的基本操作,对栈理解还是不够深刻,也有很多东西还没弄懂,有错误的地方欢迎指出

你可能感兴趣的:(数据结构)