【数据结构与算法】栈的介绍及基本运算(出栈、入栈、销毁栈等)
一、栈的介绍
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
允许插入和删除运算的一端称作栈顶(top)。
不允许插入和删除的另一端称作栈底(bottom)。
在栈顶进行的插入操作称为入栈或进栈(push)
在栈顶进行的删除操作称为出栈或退栈(pop)
栈的特点:后进先出,即 LIFO(Last In First Out)
如下图:
顺序栈的数据类型
静态分配:
#define MaxSize 100
#define int ElemType
typedef struct
{ ElemType data[MaxSize]; // 数组存储空间int top; //栈顶下标
} SqStack; // 顺序栈数据类型
MaxSize为顺序栈的最大容量;
top为栈顶元素的下标,0 <= top <= MaxSize-1
栈空:top = -1;
栈满:top = MaxSize-1
注意栈空和栈满的判断条件,如上图,栈顶top = 0 时,有数据元素a1,所以top = -1时,才能判断栈空。栈满时,由上图看知。
动态分配:
#define int ElemType
typedef struct
{ ElemType *base; //栈底的指针ElemType *top; //栈顶的指针
} SqStack; // 顺序栈数据类型
链式栈的数据型
typedef struct LNode
{ElemType data; //数据域struct LNode *next; //后继结点指针
} LinkStNode; //链栈结点类型
S:单链表头指针,指向头结点。
栈顶:单链表第一个元素结点的位置,即头结点的后一个位置。
二、顺序栈的基本运算
1、初始化栈
建立一个新的空栈s,实际上是将栈顶指示变量置-1即可。
//初始化空顺序栈
int InitStack(SqStack &S)
{S.top = -1;return 1;
}
2、入栈:
①判断栈是否已满,若满则产生上溢出错误,退出算法,否则执行第②步;
②栈顶下标增一(top++),指向新的栈顶位置;
③将新元素置于栈顶。
//item是需要入栈的数据元素
bool Push(SqStack &S, ElemType item)
{if (S.top == MaxSize - 1){cout << "栈满" << endl;return false;}S.top++;S.data[S.top] = item;return true;
}
3、出栈:
①判断栈是否为空,若空则产生下溢出错误,退出算法,否则执行第②步;
②栈顶元素出栈;
③栈顶下标减一(top++),指向新的栈顶位置;
bool Pop(SqStack &S, ElemType &item)
{if (S.top == -1){cout << "栈空" << endl;return false;}item = S.data[S.top];S.top--;return true;
}
4、判断栈是否为空
栈S为空的条件是s.top==-1。
//判栈空
int StackEmpty(SqStack &S)
{if(S.top==-1)return 1;elsereturn 0;
}
5、取栈顶元素
在栈不为空的条件下,将栈顶元素赋给e。
//取栈顶
int GetTop(SqStack &S, DataType &e)
{if(S.top <= -1){cout<<"栈空"<<endl;return 0;}item=S.items[S.top];return 1;
}
注意:
取栈顶元素和出栈不同,取栈顶元素只是把栈顶元素复制一份,栈顶指针并没有改变。如下图:
入栈时要判断栈是否满,出栈时要判断是否为空。
三、链式栈的基本运算
1、初始化栈
建立一个空栈s。实际上是创建链栈的头结点,并将其next域置为NULL。
void (SNode *&s)
{ s=(SNode *)malloc(sizeof(SNode));//s=new SNode;s->next=NULL;
}
2、入栈:
bool Push(LinkStNode *S, ElemType item)
{ //带头结点单链表的表头插入法LinkStNode *t = new LinkStNode; //①生成新结点if (t == NULL){cout << "内存不足";return false;}t->data = item;//②在栈顶插入新结点t->next = S->next;S->next = t; //③return true;
}
3、出栈:
bool Pop(LinkStNode *S, ElemType &item)
{ //删除单链表的第一个元素结点//①判断栈是否为空if (S->next == NULL){cout << "栈空";return false;}//②删除栈顶元素LinkStNode *t = S->next;S->next = t->next;item = t->data;delete t;return true;
}
4、销毁栈
//释放链栈
void Destroy(SNode *&s)
{SNode *p;while(s!=NULL){p=s;s=s->next;delete p;}
}
5、判断栈是否为空
栈S为空的条件是s->next==NULL,即单链表中没有数据结点。
//判栈空
int StackEmpty(SNode *s)
{if(s->next==NULL)return 1;elsereturn 0;
}
6、取栈顶元素
int GetTop(SNode *s,DataType &e)
{ if (s->next==NULL) //栈空的情况{return 0;}e=s->next->data;return 1;
}
【数据结构与算法】栈的介绍及基本运算(出栈、入栈、销毁栈等)相关推荐
- JAVA数据结构与算法【简单介绍】
前几天去面一个大厂,面试官特别好,面试官说到,我们的学习不能本末倒置,数据结构和算法是程序的基础,如果数据结构你没有学好,你真正意义上不算会写代码.你的代码是各处粘贴,杂乱无章的. 由于现在大多用JA ...
- [数据结构与算法]-二叉查找树(BLT)介绍及其实现(Java)
本文欢迎转载,转载前请联系作者,经允许后方可转载.转载后请注明出处,谢谢! http://blog.csdn.net/colton_null 作者:喝酒不骑马 Colton_Null from CSD ...
- Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数
先排序,再...(毕竟归并排序的时间复杂度仅为 O(nlogn)O(n\log n))排序的幽灵.排序和查找真是一对好基友. 来看基础版本: from random import randrange ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- 最新完整数据结构与算法
最新完整数据结构与算法 P11_课程介绍 P22_数据结构与算法概述_数据结构 P33_数据结构与算法概述_算法 P44_算法分析_时间复杂度分析1 P55_算法分析_时间复杂度分析2 P66_算法分 ...
- “数据结构与算法”被阿里大佬讲透了,这份笔记真是神了
写在前面 现在随着科技时代的迅速发展,数据结构与算法已经被更多企业使用以及被更多的人熟知,这也是目前很有前景的一个领域,但是市面上对于数据结构与算法的学习资料还是相对较少,很多人无从下手,那么该如何学 ...
- 如何看待 70% 的程序员,缺乏数据结构和算法知识?
金三银四来了,各大厂动静不小,都在储备人才,绝对是程序员面试的黄金时间了,不少同学也在后台反馈面试中遇到的一些问题,所以今天想跟大家说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门 ...
- 70%以上程序员,不懂数据结构和算法!
金三银四马上到来,各个公司的动静不小,都在储备人才,绝对是程序员的面试黄金时间了,想换工作的人一大把,所以今天想再说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门砖.毕竟掌握算法, ...
- 数据结构与算法【Java】06---七大查找算法总结
文章目录 数据结构与算法[Java]06---查找算法总结 1.查找算法简介 1.1.查找的定义 1.2.查找算法分类 1.3.常用查找算法 2.线性查找算法 2.1.线性查找简介 2.2.线性查找代 ...
最新文章
- 对比React Native、dcloud、LuaView三个框架技术(内部)
- 如何学好 Linux、C++,并搞定 BAT 面试 作者/分享人:天千
- 服务器错误重启mysql错误信息,mysql开启和使用事件、与服务器重启mysql错误
- Webservice入门教程_编写手机归属地查询的webservice
- OpenCV背景扣除Background Subtraction
- 以下十种性格的人不适合做程序员,你​赞同吗? ​
- 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新
- sqlserver 只有函数和扩展存储过程才能从函数内部执行
- Python+pandas+matplotlib数据分析与可视化案例(附源码)
- 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
- 使用四元数解决万向节锁(Gimbal Lock)问题
- Alpha阶段-个人总结
- 用户收货地址h5页面_如何实现H5可视化编辑器的实时预览和真机扫码预览功能?...
- 诺基亚 XGS-PON FTTP 系统在科威特完成测试
- 安装GD库 GD库安装全过程详解
- 安卓开发下载apk下载文件代码
- java url生成二维码
- 云上业务怎样更好地防御大流量攻击?
- 智能电视机安装App
- ImportError: cannot import name ‘calinski_harabaz_score‘ from ‘sklearn.metrics‘