数据结构之堆栈(一)

简介: 数据结构之堆栈

堆栈的基本概念


堆栈是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是:线性表允许在任意位置插入和删除数据元素操作,而堆栈只允许在固定一端进行插入和删除数据元素操作


根据堆栈的定义,每次进栈的数据元素都放在原当前栈顶元素之前而成为新的栈顶元素,每次退栈的数据元素都是原当前栈顶元素,这样,最后进入堆栈的数据元素总是最先退出堆栈,因此,堆栈也称作后进先出的线性表,或简称后进先出表。


例子


设有数据元素序列A,B,C,是否可以利用一个堆栈,得到数据元素序列B, A, C。


分析:按照如下方法操作:A入栈,B入栈,B出栈,A出栈,C入栈,C出栈,则输出数据元素序列为B, A, C。因此,利用一个堆栈,可以把数据元素序列A, B, C变换为数据元素序列B, A,C。其操作过程的堆栈内容示意图下图所示。


image.png


输出序列为B, A, C的操作过程


在软件设计中,需要利用堆栈进行数据元素序列转换的例子很多。例如,在编译软件系统中,就需要频繁地把中缀表达式形式的算术表达式,转换成后缀表达式形式的算术表达式。又如,任何支持递归算法的程序设计语言,都是借助堆栈来实现递归算法需要的后调用的过程先执行的要求的。


堆栈操作集合


初始化StackInitiate(S):初始化堆栈S。


非空否StackNotEmpty(S):堆栈S非空否。若堆栈非空,则函数返回1;否则函数返回0。


入栈StackPush(S, x):在堆栈S的当前栈顶插入数据元素x。


出栈StackPop(S, d):把堆栈S的当前栈顶数据元素删除并由参数d带回。若出栈成功,则返回1;失败,则返回0。


取栈顶数据元素StackTop(S, d):取堆栈S的当前栈顶数据元素并由参数d带回。若取到数据元素,则返回1;否则返回0。


顺序堆栈的存储结构


顺序存储结构的堆栈称作顺序堆栈。


顺序堆栈和顺序表的数据成员是相同的,不同之处是,顺序堆栈的入栈和出栈操作只能对当前栈顶元素进行。


顺序堆栈的存储结构示意图如图3-3所示。其中,a0, a1, a2, a3, a4表示顺序堆栈要存储的数据元素序列,stack表示顺序堆栈存放数据元素的数组,MaxStackSize表示顺序堆栈数组stack的最大存储单元个数,top表示顺序堆栈数组stack的当前栈顶位置。


image.png


顺序堆栈的存储结构示意图


定义结构体SeqStack如下:


#define MaxSize 50
typedef int ElemType;
typedef struct{
    ElemType data[MaxSize];        //连续内存空间存放栈中元素
    int top;            //存放栈顶元素在data数组中的下标
}SqStack;

顺序堆栈的操作实现


初始化StaticInitiate(*S)
void StaticInitiate(*S)
{
    S->top=0;    //初始化栈顶下标值
}

非空否StackNotEmpty(S)


int StackPush(SeqStack *S,DataType x)//把数据元素x存入顺序堆栈S中,入栈成功返回1,否则返回0
{
    if(S->top>=MaxStackSize)
    {
        printf("堆栈已满,无法插入!\n")
        return 0;
    }
    else
    {
        S->Stack[S->top]=x;
        S->top++;
        return 1;
    }
}

入栈StackPush(SeqStack *S,DataType x)


int StackPush(SeqStack *S,DataType x)//把数据元素x存入顺序堆栈S中,入栈成功返回1,否则返回0
{
    if(S->top>=MaxStackSize)
    {
        printf("堆栈已满,无法插入!\n")
        return 0;
    }
    else
    {
        S->Stack[S->top]=x;
        S->top++;
        return 1;
    }
}

出栈StackPop(SeqStack *S,DataType)


int StackPop(SeqStack *S,DataType) //取出顺序堆栈S的栈顶元素值由参数d带回,出栈成功则返回1,否则返回0
{
    if(S->top<=0)
    {
        printf("堆栈已空无数据元素出栈!\n");
        return 0;
    }
    else
    {
        S->top--;        //得注意top--,--top的差别
        *d=S->stack[S->top];
        return 1;
    }
}

取栈顶数据元素StackTop(SeqStack S,DataType *d)


int StackTop(SeqStack S,DataType *d) //取栈顶数据元素值由参数d带回,成功返回1,不成功返回0
 {
      if(S.top<=0)
      {
         printf("堆栈已空!\n");
         return 0;
      }
      else
      {
          *d=S.stack[S.top-1];
          return 1;
      }
  }

撤销动态申请空间Destory(SLNode *head)


void Destory(SLNode *head)
{
    LSNode *p,*p1;
    p=head;
    while(p!=NULL)
    {
        p1=p;
        p=p->next;
        free(p);
    }
}


相关文章
|
算法 编译器
数据结构堆栈(中缀到后缀)
数据结构堆栈(中缀到后缀)
94 0
|
存储 算法 C++
堆栈数据结构(介绍与程序)
堆栈数据结构(介绍与程序)
204 0
|
IDE 开发工具 Windows
数据结构——堆栈
时间过的真快呀,上次发文章还是在2月,上学之后很忙,现在肯定要将数据结构的内容尽快的更新完成,早日拿到专家博主。Stack叫栈,或者叫堆栈,这是一个很重点的概念,我将在这篇文章中举出很多的例子,让你能在生活中,windows系统发现那些叫做栈。
204 0
数据结构——堆栈
|
存储 Java 索引
21.从入门到精通:Python数据结构 列表 将列表当做堆栈使用 将列表当作队列使用 列表推导式 嵌套列表解析 del 语句
21.从入门到精通:Python数据结构 列表 将列表当做堆栈使用 将列表当作队列使用 列表推导式 嵌套列表解析 del 语句
|
存储 Java
数据结构(1)线性结构——数组、链表、堆栈、队列(介绍和JAVA代码实现)
1.1.线性表 线性表是指由同种元素构成的有序且线性的一种数据结构,由于其有序且线性的特点,可以抽象出对其的一个操作集:
208 0
|
算法 数据可视化 C语言
数据结构 | 后缀表达式【深入剖析堆栈原理】
数据结构之堆栈的应用中的后缀表达式讲解,层层递进,由浅入深,带你深刻理解后缀表达式
761 0
数据结构 | 后缀表达式【深入剖析堆栈原理】
数据结构 | 队列探究与学习、对比堆栈、队列存储实现
前言:上一篇我们讲解了堆栈相关的知识点,今天我们就对队列详细讲讲,并在此文中将其与堆栈进行适当对比,队列最主要的两个操作是什么呢,我们一起往下看吧 队列(Queue) 概念: 具有一定操作约束的线性表,插入和删除操作,只能在一端插入,而在另一端删除 堆栈也是受限的线性表,但它的插入和删除只在一端进行 数据插入:入队列(AddQ) 数据删除:出队列(DeleteQ) 先来先服务,先进先出(FIFO) 堆栈——先进后出 队列抽象数据类型描述 数据对象集:
数据结构 | 队列探究与学习、对比堆栈、队列存储实现
|
存储 算法 C语言
C语言数据结构 | 堆栈顺序、链式存储及表达式求值
从计算机对表达式求值引入算数表达式在求值时若无优先级,那么从左到右运算就很容易,但算术表达式由两类对象构成一个是一个是+-*/······不同的运算符号优先级也不一样此时运算就比较困难 ,无法判断运算符后一个运算数是否参与这次运算。
C语言数据结构 | 堆栈顺序、链式存储及表达式求值
|
机器学习/深度学习 算法 C++
|
存储 算法 C++
【奇妙的数据结构世界】用图像和代码对堆栈的使用进行透彻学习 | C++
简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。
223 0

热门文章

最新文章