数据结构05 栈
时间:2022-05-04
本文章向大家介绍数据结构05 栈,主要内容包括1、栈是什么、2、栈的存储结构、3、栈的常见操作及代码实现、3-2、进栈、3-3、出栈、3-4、获取栈顶元素、3-5、判断是否栈空、3-6、判断是否栈满、3-7、获取栈中元素个数、4、测试、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
这篇文章要总结的是栈,主要从以下几个方面来进行总结。
1、栈是什么 2、栈的存储结构 3、栈的常见操作及代码实现
1、栈是什么
栈是一种特殊的线性表,它限定了只能在表的一端进行插入与删除操作。因此,栈就是后进先出 Last In First Out (LIFO) 的线性表。
线性表分为顺序表和链表,所以栈分为顺序栈和链式栈,为了方便演示,下文所使用的栈都是顺序栈。
它的应用场景有很多,比如手枪弹夹里面的子弹,只能从一端塞入或者取出子弹。
2、栈的存储结构
顺序栈的代码实现:
SeqStack.java
/**
* 自己封装一个顺序栈
*/
public class SeqStack {
// 使用数组来存放元素
public Object[] data;
// 栈顶指针
public int top;
public SeqStack(int length) {
data = new Object[length];
}
}
3、栈的常见操作及代码实现
3-1、初始化
实现思路:用指定大小的 length 实例化一个 SeqStack,然后使top指针指向-1
代码:
SeqStackOperate.java
public class SeqStackOperate {
/**
* 初始化
* @param length
* @return
*/
public SeqStack init(int length) {
SeqStack seqStack = new SeqStack(length);
seqStack.top = -1;
return seqStack;
}
}
3-2、进栈
实现思路:将top指针加1,然后将新元素插入到top指针指向的位置。
代码:
SeqStackOperate.java 中添加方法
/**
* 进栈
* @param seqStack
* @param data
*/
public void push(SeqStack seqStack, Object data) {
// 检查栈是否满了
if (seqStack.top == seqStack.data.length - 1) {
return;
}
seqStack.top++;
seqStack.data[seqStack.top] = data;
}
3-3、出栈
实现思路:删除top指针指向的元素,并使top指针减1
代码:
SeqStackOperate.java 中添加方法
/**
* 出栈
* @param seqStack
* @return
*/
public Object pop(SeqStack seqStack) {
// 检查栈是否为空
if (seqStack.top == -1) {
return null;
}
Object obj = seqStack.data[seqStack.top];
seqStack.data[seqStack.top] = null;
seqStack.top--;
return obj;
}
3-4、获取栈顶元素
实现思路:与出栈相似,但是不删除栈顶元素。
代码:
SeqStackOperate.java 中添加方法
/**
* 获取栈顶元素
*
* @param seqStack
* @return
*/
public Object getTopData(SeqStack seqStack) {
// 检查栈是否为空
if (seqStack.top == -1) {
return null;
}
return seqStack.data[seqStack.top];
}
3-5、判断是否栈空
实现思路:判断top指针是否等于-1就可以
代码:
SeqStackOperate.java 中添加方法
/**
* 判断是否栈空
* @param seqStack
* @return
*/
public boolean isEmpty(SeqStack seqStack) {
return seqStack.top == -1;
}
3-6、判断是否栈满
实现思路:检查top指针的值与数组长度减1是否相等,如果相等则为栈满。
代码:
SeqStackOperate.java 中添加方法
/**
* 判断是否栈满
* @param seqStack
* @return
*/
public boolean isFull(SeqStack seqStack) {
return seqStack.top == seqStack.data.length - 1;
}
3-7、获取栈中元素个数
实现思路:top指针的值加1就是栈中的元素个数。
代码:
SeqStackOperate.java 中添加方法
/**
* 获取栈中元素个数
*
* @param seqStack
* @return
*/
public int getLength(SeqStack seqStack) {
return seqStack.top + 1;
}
4、测试
添加一个用来测试的类:StackTest.java
public class StackTest {
public static void main(String[] args) {
SeqStackOperate seqStackOperate = new SeqStackOperate();
// 初始化一个栈,最大长度为5
SeqStack seqStack = seqStackOperate.init(5);
// 看看能否放进6个元素
seqStackOperate.push(seqStack, 1);
seqStackOperate.push(seqStack, 2);
seqStackOperate.push(seqStack, 3);
seqStackOperate.push(seqStack, 4);
seqStackOperate.push(seqStack, 5);
seqStackOperate.push(seqStack, 6);
// 输出栈当前的长度
int length = seqStackOperate.getLength(seqStack);
System.out.println("栈当前的长度:" + length);
System.out.println("");
// 出栈
Object obj = seqStackOperate.pop(seqStack);
System.out.println("出栈的元素是 ---- " + obj);
System.out.println("");
// 输出栈当前的长度
length = seqStackOperate.getLength(seqStack);
System.out.println("栈当前的长度:" + length);
System.out.println("");
// 输出当前的栈顶元素
obj = seqStackOperate.getTopData(seqStack);
System.out.println("当前的栈顶元素是 ---- " + obj);
System.out.println("");
}
}
测试结果:
- 让你的笔记本更快一点——我的笔记本的性能测试和虚拟硬盘(把内存当成硬盘)的使用感觉
- 分页解决方案 之 数据访问函数库——另类的思路、另类的写法,造就了不一样的发展道路。
- 分页解决方案 之 QuickPager的使用方法(在UserControl里面使用分页控件的方法)
- 分页解决方案 之 QuickPager的使用方法(URL分页、自动获取数据)
- 分页解决方案 之 QuickPager的使用方法(PostBack分页、自定义获取数据)
- QuickPager asp.net 分页控件、表单控件等自定义控件下载 和介绍 【2009.09.07更新】
- 分页解决方案 之 QuickPager的使用方法(PostBack分页、自动获取数据)
- 【自然框架】之鼠标点功能现(二):表单控件的“应用”—— 代码?只写需要的!
- 基于Docker环境中源码部署容器Nginx
- 使用Ansible playbooks快速构建etcd集群
- 使用系统内置script和scriptreplay命令来记录操作记录
- 【机器学习】我在面试机器学习、大数据岗位时遇到的各种问题
- 【机器学习】机器学习编程语言之争狼烟再起,Python称霸?
- TiDB 1.1 Beta Release
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你知道C语言中的危险函数吗?
- python与安全(四)shell反弹
- 怎么快速修复 bug ?
- 变量类型(cpu/gpu)
- 【Go语言学习】匿名函数与闭包
- Python中两种UnboundLocalError的解决方法
- 传智播客OA项目学习--阶段二(实体设计及技巧)
- 小生归一(五)md5扩展长度攻击
- 传智播客OA项目学习--阶段二(系统管理模块)
- main函数中的argc和argv到底是个啥?
- 传智播客OA项目学习--阶段一(2、框架整合)
- 微信XML消息model定义之微信公众平台(一)
- 自动返回笑话接口调用之微信公众平台(二)
- 「实战」 缘分使我们(骗子)相遇
- json-lib简单使用之微信公众平台(三)