一、栈的介绍
栈(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;
}

【数据结构与算法】栈的介绍及基本运算(出栈、入栈、销毁栈等)相关推荐

  1. JAVA数据结构与算法【简单介绍】

    前几天去面一个大厂,面试官特别好,面试官说到,我们的学习不能本末倒置,数据结构和算法是程序的基础,如果数据结构你没有学好,你真正意义上不算会写代码.你的代码是各处粘贴,杂乱无章的. 由于现在大多用JA ...

  2. [数据结构与算法]-二叉查找树(BLT)介绍及其实现(Java)

    本文欢迎转载,转载前请联系作者,经允许后方可转载.转载后请注明出处,谢谢! http://blog.csdn.net/colton_null 作者:喝酒不骑马 Colton_Null from CSD ...

  3. Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数

    先排序,再...(毕竟归并排序的时间复杂度仅为 O(nlogn)O(n\log n))排序的幽灵.排序和查找真是一对好基友. 来看基础版本: from random import randrange ...

  4. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  5. 最新完整数据结构与算法

    最新完整数据结构与算法 P11_课程介绍 P22_数据结构与算法概述_数据结构 P33_数据结构与算法概述_算法 P44_算法分析_时间复杂度分析1 P55_算法分析_时间复杂度分析2 P66_算法分 ...

  6. “数据结构与算法”被阿里大佬讲透了,这份笔记真是神了

    写在前面 现在随着科技时代的迅速发展,数据结构与算法已经被更多企业使用以及被更多的人熟知,这也是目前很有前景的一个领域,但是市面上对于数据结构与算法的学习资料还是相对较少,很多人无从下手,那么该如何学 ...

  7. 如何看待 70% 的程序员,缺乏数据结构和算法知识?

    金三银四来了,各大厂动静不小,都在储备人才,绝对是程序员面试的黄金时间了,不少同学也在后台反馈面试中遇到的一些问题,所以今天想跟大家说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门 ...

  8. 70%以上程序员,不懂数据结构和算法!

    金三银四马上到来,各个公司的动静不小,都在储备人才,绝对是程序员的面试黄金时间了,想换工作的人一大把,所以今天想再说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门砖.毕竟掌握算法, ...

  9. 数据结构与算法【Java】06---七大查找算法总结

    文章目录 数据结构与算法[Java]06---查找算法总结 1.查找算法简介 1.1.查找的定义 1.2.查找算法分类 1.3.常用查找算法 2.线性查找算法 2.1.线性查找简介 2.2.线性查找代 ...

最新文章

  1. 文巾解题 113. 路径总和 II
  2. 这是对R的误解!R的应用原来这么广!
  3. QTP基础学习(二)启动与设置
  4. 前端学习(2959):axios介绍
  5. 今天开始学习QT for sysbiam 1
  6. php输出下载地址,PHP实现的文件直接输出下载
  7. 后缀表达式转中缀表达式(非常简单易懂)
  8. CSUOJ 1197- Staginner 买葡萄
  9. pitch yaw roll是什么
  10. 机器搜索引擎 vs 人肉搜索引擎(作者:胡宝介)
  11. 计算机系统集成项目工程师报名,2021年系统集成项目管理工程师报名流程
  12. 托业考试简述 — 托业考试题型、托业考试结构、托业考试考场时间、托业考试学习策略
  13. 会议流程安排以及详细的资料。
  14. Delphi 华氏度和摄氏度转换(亲测可用)
  15. OPENGL 简单图形绘制
  16. 如何获取美团饿了么的推广链接赚钱
  17. Android性能优化系列之Bitmap图片优化
  18. 单页面应用微信公众号开发
  19. KernelGAN论文详解分享
  20. 更换内存条、固态硬盘、双系统配置全纪录

热门文章

  1. 门控时钟设计003:门控时钟降低了什么功耗
  2. (转)KEIL里 Volatile的用法
  3. R语言基础 | 方差分析(2):多因素方差分析(上)
  4. express+mongoDB项目创建及API使用步骤
  5. c语言挖宝游戏,[推荐][传承]挖宝秘籍 铲子在手宝躲我有
  6. 计算机黑科技ppt英文,微软黑科技:PPT全文翻译
  7. 瑞尔齿科要流血上市,可未消肿的牙龈难拔“智齿”
  8. IT工作 行业与岗位分析
  9. Ghostscript和Gsview下载安装,matlab图形去白边方法汇总
  10. python地形图渲染_Python-Evoked地形图可视化