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

数据结构-栈

作者头像
chaibubble
发布于 2018-01-02 03:27:05
发布于 2018-01-02 03:27:05
76600
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《大话数据结构》栈-代码汇总
//栈的结构定义 //元素下标同数组 从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
2140
《大话数据结构》栈-代码汇总
数据结构学习—栈
栈的定义 限定在表尾作插入、删除操作的线性表,表中允许进行插入、删除操作的一端称为栈顶(Top),表的另一端称为栈底(Bottom)。 顺序栈 用顺序存储结构实现的栈,即利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须设一个位置指针top(栈顶指针)来动态的指示栈顶元素在顺序栈中的位置。(通常以top=-1表示空栈) #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define
用户5513909
2023/04/25
1760
数据结构学习—栈
数据结构——链栈
链栈 链栈的表示 运算是受限的单链表,只能在链表头部进行操作,故没有必要附加头结点。栈顶指针就是链表的头指针。 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
3120
数据结构——链栈
《王道》数据结构笔记整理2022级_数据结构笔记整理
1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。
全栈程序员站长
2022/09/22
3.2K0
《王道》数据结构笔记整理2022级_数据结构笔记整理
栈练习——括号匹配
括号匹配 [2019031022041247.png] #include<iostream> #include<string> #include<cstring> using namespace std; #define OVERFLOW -2 #define OK 1 #define ERROR -1 typedef int Status; typedef char SElemType; typedef struct StackNode { SElemType data; struct Sta
ruochen
2021/05/18
8970
栈练习——括号匹配
栈练习——进制转换
#include<iostream> using namespace std; #define OVERFLOW -2 #define OK 1 #define ERROR -1 typedef int Status; typedef int SElemType; typedef struct StackNode { SElemType data; struct StackNode* next; }StackNode, * LinkStack; // 链栈初始化 void InitStack(L
ruochen
2021/05/18
2270
栈练习——进制转换
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
https://netsecur-cloud-ljs.blog.csdn.net/article/details/142311773 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​
盛透侧视攻城狮
2024/10/22
1320
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序栈的基本操作
栈是限定仅在表尾进行插入好删除操作的线性表。 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
3750
栈练习——逆波兰表达式
逆波兰表达式 可参照文章逆波兰表达式算法分析 若当前字符是操作数,则压栈 若当前字符是操作符,则弹出栈中的两个操作数,计算后仍然压入栈中C++代码实现 /* 后缀表达式(逆波兰表达式) 有效操作只有'+'、'-'、'*'、'/',且操作数是整数 */ #include<iostream> #include<string> #include<assert.h> #include<cstring> using namespace std; #define OVERFLOW -2 #define OK 1 #
ruochen
2021/05/18
3650
栈练习——逆波兰表达式
数据结构——顺序栈
栈 定义:只能在表的一端(栈顶)进行插入和删除运算的线性表 逻辑结构:一对一关系 存储结构 - 顺序栈 - 链栈 运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则 实现方式 - 入栈 - 出栈 - 读栈顶元素值 - 建栈 - 判断栈空 - 判断栈慢 - 清空栈 - 销毁栈 栈的表示和操作的实现 [在这里插入图片描述][在这里插入图片描述] [在这里插入图片描述] 顺序栈的C++代码实现 #include<iostream>
ruochen
2021/06/28
4630
数据结构——顺序栈
(重点)链式栈
顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用完而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用。而对于链式栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间,另外当某个项目不使用时也可将内存返还给系统。顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据
猿人谷
2018/01/17
9530
(重点)链式栈
C++栈的基本操作及原理和STL函数
第二种 status(这个表示函数状态 ,类型根据定义 ,如:typedef int Status 或 typedef char Stau)
莫浅子
2022/11/18
4800
C++栈的基本操作及原理和STL函数
【数据结构(C语言版)系列二】 栈
栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。
闪电gogogo
2018/10/10
1.5K0
【数据结构(C语言版)系列二】  栈
【数据结构】栈队列代码实现
文章链接: http://ctrlx.life/post/218c7301.html
CtrlX
2023/03/13
4390
顺序栈的实现和两栈共享空间
顺序栈的实现和两栈共享空间 一.顺序栈的实现        栈(stack)是限定仅在表尾进行插入或删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),
猿人谷
2018/01/17
1.9K0
顺序栈的实现和两栈共享空间
数据结构 | 栈
01 栈的定义 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称 LIFO 结构。 从上面这两段话,可以确定:首先栈是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系,只不过它是一种特殊的线性表。定义中说在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。 栈的插入操作,叫做进栈,也叫压栈、入栈。 栈
用户1332428
2018/03/08
7540
数据结构 | 栈
数据结构资料汇编:栈
以上两种定义,本质上是一样的。在第一种定义中,栈 s 的指针 s.base 在对栈进行操作时不变化,因此可以用它指向栈的数据元素。
老齐
2023/03/02
5520
数据结构资料汇编:栈
【数据结构】C语言实现顺序栈
大家好,很高兴又和大家见面啦!!! 在上一个篇章中,我们介绍了栈的基本概念,以及栈中的重要术语。通过介绍我们知道了栈的本质也是一种线性表,只不过它是一种操作受限的线性表。因此栈的实现方式与线性表的实现实际上是大同小异的。下面我们就来介绍一下如何通过C语言实现栈。
蒙奇D索隆
2024/01/16
6440
【数据结构】C语言实现顺序栈
算法与数据结构——顺序存储栈和链式存储栈
先上官方定义:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
CC老师
2022/01/12
4870
算法与数据结构——顺序存储栈和链式存储栈
栈的基本实现(更新中)
参考着严蔚敏的《数据结构(C语言版)》,用自己拿渣的可怜的C语言做了一下午的实现。。。也没能写出来几个。。。就很菜(气哭)。。。
李志伟
2019/12/17
5880
推荐阅读
相关推荐
《大话数据结构》栈-代码汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档