深入理解数据结构原理(1)—栈(Stack)
目录
一、栈的定义
二、栈的基本操作
三、栈的实际操作
一、栈的定义
栈(Stack)是一种只允许在一端进行插入或者删除的操作的线性表。可以理解为一个桶里装进去的一层一层叠加压入进去的东西,栈的性质是进行先入后出的原则,也就是说最先进入栈的元素最后才出来。
栈包含:
1、栈顶(Top):线性表允许进行插入和删除的一端。
2、栈底(Bottom):是固定的,和栈顶相反,不允许进行插入和删除的一端。
3、空栈:不含有任何的元素的空表。
二、栈的基本操作
1、InitStack(&s):初始化一个空的栈记为:s。(&:表示引用调用C语言中使用)
2、StakeEmpty(s):判断栈是否空,空返回 turn,否则返回 false。
3、Push(&s):进栈,当栈处于未满的状态,将这个元素 x(新进入的元素)作为新栈顶。
4、Pop(&s,&x):出栈,当栈处于非空状态,则弹出栈顶元素,用 x 返回。
5、GetTop(s,&x):拿去栈顶元素,当栈处于非空状态,用 x 返回。
6、DestroyStack(&s):销毁这个栈,释放栈所占的储存空间。
java代码:
public class lc003 {public static void main(String[] args) {Stack<String> stack = new Stack<String>(); // 定义一个栈// push 进栈stack.push("111");stack.push("aaa");stack.push("11aa");// pop 出栈String st1 = stack.pop();String st2 = stack.pop();String st3 = stack.pop();// 输出System.out.println("第一个出来:"+st1);System.out.println("第二个出来:"+st2);System.out.println("第三个出来:"+st3);}
}
注意看出栈顺序:
第一个出来:11aa
第二个出来:aaa
第三个出来:111Process finished with exit code 0
三、栈的应用
一、栈的简单应用场景
1、子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
2、处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
3、表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
4、二叉树的遍历。
5、图形的深度优先(depth-first)搜索法
6、递归-汉若塔
7、迷宫求解
二、代码实现栈
1、java中用数组实现
top为栈顶,初始值为-1(如果进入第一元素top++,索引就成了0开始)
class ArrayStack{private int maxStackSize; // 定义栈的大小private int[] stack; // 定义数组模拟栈private int top = -1; // 定义栈顶 初始值为-1// 定义构造器 初始化栈public ArrayStack(int maxStackSize){this.maxStackSize = maxStackSize;stack = new int[maxStackSize];}// 栈的满public boolean isFull() {return top == maxStackSize-1;}// 栈的空public boolean isEmpty() {return top == -1;}// 入栈public void push(int value) {// 判断栈是否是空状态if (isFull()) {System.out.printf("栈满了……");return;}//每当进入一个元素 top往上加一top++;stack[top] = value;}// 出栈 出栈是返回的是栈顶的元素public int pop(){// 判断栈是否是空状态if (isFull()) {// 异常处理throw new RuntimeException("栈是空的,里面没有数据……")}int value = stack[top]; // 返回的元素为栈顶元素top--;return value;}// 遍历栈public void listArrayStack(){if (isEmpty()) {System.out.println("栈是空的,里面没有数据……");}// 遍历时,需要从栈顶开始显示数据for (int i = top; i >= 0; i--) {System.out.println("遍历的栈为"+stack[i]);}}
}
在java中的操作方法有
序号 | 方法描述 |
---|---|
1 |
boolean empty() 测试堆栈是否为空。 |
2 |
Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。 |
3 |
Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。 |
4 |
Object push(Object element) 把项压入堆栈顶部。 |
5 |
int search(Object element) 返回对象在堆栈中的位置,以 1 为基数。 |
深入理解数据结构原理(1)—栈(Stack)相关推荐
- 数据结构基础:栈(Stack)
什么是栈? 栈是限制插入和删除只能在同一个位置上进行的表,这个位置就是栈的顶端,对于栈的操作主要有三种形式:入栈(将元素插入到表中),出栈(将表最后的元素删除,也就是栈顶的元素),返回栈顶元素.栈有时 ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- Java 集合深入理解(13):Stack 栈
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情不错,再来一篇 Stack ! 数据结构中的 栈 数据结构中,栈是一种线性数据结构,遵从 LIFO(后进先出)的操 ...
- 备战NOI 数据结构——栈与单调栈(stack) 以及后缀表达式
栈 stack 引入 栈的概念 代码实现 定义和初始化(init) 入栈(push) 出栈(pop) 访问栈顶元素(query) 查询栈的元素个数(size) 判断是否为空(empty) 清空栈(cl ...
- (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)
文章目录 bss段 data段 text段 堆(heap) 栈(stack) 一个程序本质上都是由 bss段.data段.text段三个组成的. 存储类型总结 bss段 bss段(bss segmen ...
- 线性数据结构之栈(Stack)
一.栈(Stack) 栈是一种用于存储数据的简单数据结构(与链表类似) , 栈的关键就是入栈的次序 , 比如我们在交作业的时候 , 最先交的永远都在最后面 , 而老师检查的时候是从最上面开始拿 , 所 ...
- 数据结构之关于栈的“先进后出”的理解
栈就是一种存储结构,并且是一种必须满足"先进后出"原则的存储结构.关于先进后出,可以这么理解:可以把栈看成是一个箱子,往箱子里放进.取出东西的顺序一样(我们往箱子里放东西,先放进去 ...
- 在java的实现栈的插入数据_Java实现数据结构栈stack和队列Queue
回顾JDK提供的集合类 容器(集合)框架如下: 集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身. 集合类型主要有3种:set(集).list(列表)和map(映射). C ...
- Python数据结构实战—栈(Stack)
文章目录 1.栈的性质(后进先出) 2.使用deque作为栈 3.使用双端队列实现Stack类 1.栈的性质(后进先出) s = [] #定义一个空数组装元素 s.append('https://ww ...
最新文章
- 如何设计可自学习的五子棋AI?
- iOS 使用FFmpeg实现视频H264编码
- xUtils简介及其使用方法
- stale element reference: element is not attached to the page document 异常
- JAVA NIO之Direct Buffer 与 Heap Buffer的区别?
- 记一次 react 15.3.1 老项目升级到 react 16.7.0 之路
- 【TCP/IP 协议】 TCP/IP 基础
- 一步步用zTree(2)
- JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
- android 多手指触摸屏,AIR Android:关于多点触摸
- 让开!!!谁也别拦着我封装React组件!
- vue如何在末尾添加_怎样在Linux上开发vue项目
- gis里怎么把两个不同坐标系的图叠在一起_坐标系那些事儿
- 五款可以取代 Slack 的开源工具
- php 字符串操作函数
- css中visibility与display的区别
- 你的编程能力从什么时候开始突飞猛进?
- UNITY3D报错 bug reporter
- PowerShell获取货币符号
- 一、Mahony姿态解算——坐标系变换