首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构-栈

数据结构-栈

作者头像
chaibubble
发布于 2018-01-02 03:27:05
发布于 2018-01-02 03:27:05
75700
代码可运行
举报
运行总次数:0
代码可运行

栈的定义

栈是一种特殊的线性表,仅允许在表的一端进行插入和删除运算。这一端被称为栈顶(top),相对地,把另一端称为栈底(bottom)。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。所以栈具有“后入先出”的特点(LIFO)。

栈的存储结构

顺序存储于链式存储都能实现一个栈,其中顺序存储的形式大概是这样:

一般的,把数组的第一个位置[0]作为栈底,再单独定义一个变量指示栈顶:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 顺序栈结构 */
typedef int SElemType; 
typedef struct
{
        SElemType data[MAXSIZE];
        int top; /* 用于栈顶指针 */
}SqStack;

在栈的链式结构实现中,一般把链表的头指针做为栈顶,按照先后顺序来看的,这种定义与数组正好是反过来的,这是由于在顺序结构中,查找是非常方便的,插入和移动不方便。但是链式结构只知道头指针,查找不方便,但是插入方便,而对于栈而言,我们需要知道栈顶的位置,所以就干脆把链表头指针作为栈顶吧,同时由于插入方便,每次在链的开头插入一个结点很容易。

那么栈的链式存储的形式大概是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef int SElemType; 
/* 链栈结构 */
typedef struct StackNode
{
        SElemType data;
        struct StackNode *next;
}StackNode,*LinkStackPtr;

栈的常用操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 
typedef int Status; 
typedef int SElemType; 
Status visit(SElemType c)
{
        printf("%d ",c);
        return OK;
}

顺序栈:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*  构造一个空栈S */
Status InitStack(SqStack *S)
{ 
    /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
    S->top=-1;
    return OK;
}

/* 把S置为空栈 */
Status ClearStack(SqStack *S)
{ 
    S->top=-1;
    return OK;
}

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(SqStack S)
{ 
    if (S.top==-1)
        return TRUE;
    else
        return FALSE;
}

/* 返回S的元素个数,即栈的长度 */
int StackLength(SqStack S)
{ 
    return S.top+1;
}

/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
Status GetTop(SqStack S,SElemType *e)
{
    if (S.top==-1)
        return ERROR;
    else
        *e=S.data[S.top];
    return OK;
}

/* 插入元素e为新的栈顶元素 */
Status Push(SqStack *S,SElemType e)
{
    if(S->top == MAXSIZE -1) /* 栈满 */
    {
        return ERROR;
    }
    S->top++;               /* 栈顶指针增加一 */
    S->data[S->top]=e;  /* 将新插入元素赋值给栈顶空间 */
    return OK;
}

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(SqStack *S,SElemType *e)
{ 
    if(S->top==-1)
        return ERROR;
    *e=S->data[S->top]; /* 将要删除的栈顶元素赋值给e */
    S->top--;               /* 栈顶指针减一 */
    return OK;
}

/* 从栈底到栈顶依次对栈中每个元素显示 */
Status StackTraverse(SqStack S)
{
    int i;
    i=0;
    while(i<=S.top)
    {
        visit(S.data[i++]);
    }
    printf("\n");
    return OK;
}

链栈:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*  构造一个空栈S */
Status InitStack(LinkStack *S)
{ 
        S->top = (LinkStackPtr)malloc(sizeof(StackNode));
        if(!S->top)
                return ERROR;
        S->top=NULL;
        S->count=0;
        return OK;
}

/* 把S置为空栈 */
Status ClearStack(LinkStack *S)
{ 
        LinkStackPtr p,q;
        p=S->top;
        while(p)
        {  
                q=p;
                p=p->next;
                free(q);
        } 
        S->count=0;
        return OK;
}

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
Status StackEmpty(LinkStack S)
{ 
        if (S.count==0)
                return TRUE;
        else
                return FALSE;
}

/* 返回S的元素个数,即栈的长度 */
int StackLength(LinkStack S)
{ 
        return S.count;
}

/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
Status GetTop(LinkStack S,SElemType *e)
{
        if (S.top==NULL)
                return ERROR;
        else
                *e=S.top->data;
        return OK;
}

/* 插入元素e为新的栈顶元素 */
Status Push(LinkStack *S,SElemType e)
{
        LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode)); 
        s->data=e; 
        s->next=S->top; /* 把当前的栈顶元素赋值给新结点的直接后继,见图中① */
        S->top=s;         /* 将新的结点s赋值给栈顶指针,见图中② */
        S->count++;
        return OK;
}

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S,SElemType *e)
{ 
        LinkStackPtr p;
        if(StackEmpty(*S))
                return ERROR;
        *e=S->top->data;
        p=S->top;                   /* 将栈顶结点赋值给p,见图中③ */
        S->top=S->top->next;    /* 使得栈顶指针下移一位,指向后一结点,见图中④ */
        free(p);                    /* 释放结点p */        
        S->count--;
        return OK;
}
/* 从栈底到栈顶依次对栈中每个元素显示 */
Status StackTraverse(LinkStack S)
{
        LinkStackPtr p;
        p=S.top;
        while(p)
        {
                 visit(p->data);
                 p=p->next;
        }
        printf("\n");
        return OK;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构学习—栈
栈的定义 限定在表尾作插入、删除操作的线性表,表中允许进行插入、删除操作的一端称为栈顶(Top),表的另一端称为栈底(Bottom)。 顺序栈 用顺序存储结构实现的栈,即利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须设一个位置指针top(栈顶指针)来动态的指示栈顶元素在顺序栈中的位置。(通常以top=-1表示空栈) #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define
用户5513909
2023/04/25
1680
数据结构学习—栈
【数据结构】栈队列代码实现
文章链接: http://ctrlx.life/post/218c7301.html
CtrlX
2023/03/13
4310
数据结构资料汇编:栈
以上两种定义,本质上是一样的。在第一种定义中,栈 s 的指针 s.base 在对栈进行操作时不变化,因此可以用它指向栈的数据元素。
老齐
2023/03/02
5440
数据结构资料汇编:栈
《大话数据结构》栈-代码汇总
//栈的结构定义 //元素下标同数组 从0开始 //*************************** #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAXSIZE 1000 #define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //*************************** typedef int Statu
半生瓜的blog
2023/05/12
2050
《大话数据结构》栈-代码汇总
顺序栈的基本操作
栈是限定仅在表尾进行插入好删除操作的线性表。 1、顺序栈结构 typedef struct { SElemType data[MAXSIZE]; int top; /* 用于栈顶指针 */ }SqStack; 2、构造一个空栈  / 清空栈 Status InitStack(SqStack *S) { /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */ S->top=-1
亦小河
2022/11/14
3620
【图解数据结构】 栈&队列
1.栈 1.1栈的定义 栈(stack)是限定在表尾进行插入和删除的操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不包含任何数据元素的栈称为空栈。栈又称
撸码那些事
2018/06/21
1.4K0
数据结构 | 栈
01 栈的定义 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称 LIFO 结构。 从上面这两段话,可以确定:首先栈是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系,只不过它是一种特殊的线性表。定义中说在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。 栈的插入操作,叫做进栈,也叫压栈、入栈。 栈
用户1332428
2018/03/08
7480
数据结构 | 栈
(重点)链式栈
顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用完而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用。而对于链式栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间,另外当某个项目不使用时也可将内存返还给系统。顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据
猿人谷
2018/01/17
9450
(重点)链式栈
数据结构——链栈
链栈 链栈的表示 运算是受限的单链表,只能在链表头部进行操作,故没有必要附加头结点。栈顶指针就是链表的头指针。 C++代码实现 #include<iostream> #include<stdlib.h> using namespace std; #define OVERFLOW -2 #define OK 1 #define ERROR -1 typedef int Status; typedef int SElemType; typedef struct StackNode { SElemTyp
ruochen
2021/06/28
3040
数据结构——链栈
数据结构学习笔记(特殊的线性表:栈与队列)
栈与队列 栈是限定仅在表尾(栈顶)进行插入和删除操作的线性表(后进先出)。 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(先进先出)。 栈(Stack): 1.下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作为栈底。 定义一个top变量来指示栈顶元素在数组中的位置。栈顶位置top必须小于存储栈长度StackSize,把空栈的判定条件定位top等于-1。 2.进栈与出栈操作(顺序存储结构): 进栈操作push: /*插入元素e为新的栈顶元素*/ Status Push
希希里之海
2018/05/16
7600
算法与数据结构——顺序存储栈和链式存储栈
先上官方定义:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
CC老师
2022/01/12
4780
算法与数据结构——顺序存储栈和链式存储栈
数据结构——顺序栈
栈 定义:只能在表的一端(栈顶)进行插入和删除运算的线性表 逻辑结构:一对一关系 存储结构 - 顺序栈 - 链栈 运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则 实现方式 - 入栈 - 出栈 - 读栈顶元素值 - 建栈 - 判断栈空 - 判断栈慢 - 清空栈 - 销毁栈 栈的表示和操作的实现 [在这里插入图片描述][在这里插入图片描述] [在这里插入图片描述] 顺序栈的C++代码实现 #include<iostream>
ruochen
2021/06/28
4600
数据结构——顺序栈
【数据结构(C语言版)系列二】 栈
栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。
闪电gogogo
2018/10/10
1.5K0
【数据结构(C语言版)系列二】  栈
数据结构代码题-栈、队列
04.设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。
愷龍
2023/10/16
3340
数据结构代码题-栈、队列
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
https://netsecur-cloud-ljs.blog.csdn.net/article/details/142311773 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​
盛透侧视攻城狮
2024/10/22
1260
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序栈的实现和两栈共享空间
顺序栈的实现和两栈共享空间 一.顺序栈的实现        栈(stack)是限定仅在表尾进行插入或删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),
猿人谷
2018/01/17
1.9K0
顺序栈的实现和两栈共享空间
栈的基本实现(更新中)
参考着严蔚敏的《数据结构(C语言版)》,用自己拿渣的可怜的C语言做了一下午的实现。。。也没能写出来几个。。。就很菜(气哭)。。。
李志伟
2019/12/17
5770
找BUG
---- layout: default title: 找BUG category: [技术, C/C++] comments: true --- 找一找BUG 一段代码,实现一个pop,push,和getmin都是O(1)的方法. 最初源代码 伙伴代码如下,代码的地址可以通过这个访问: Ubuntu Pastebin https://paste.ubuntu.com/p/cX2Cq56PYt/ #include <stdio.h> #include <stdlib.h> #include <s
@坤的
2018/06/04
1.9K0
java算法刷题00——数据结构基础知识回顾
数据、数据元素(如一个账号)、数据项(密码、昵称)、数据结构(具有关系的一组数据元素集合,联想汉字的结构其实就是具有布局关系的符号组合)、数据对象(具有相同性质的数据元素的集合、一家海底捞的排队信息可以看作数据结构、全国所有门店排队信息看做同一个数据对象,它们虽无直接关系,但是具有同样的联系)
半旧518
2022/10/26
3050
数据结构(四):栈
栈是只能在一端进行插入和删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。栈顶的位置是动态的,由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底。
渔父歌
2018/12/14
8010
相关推荐
数据结构学习—栈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档