当前位置: 首页 > news >正文

栈(Stack)的详解

目录

1.栈的概念

2.栈的模拟实现

1.栈的方法

2.模拟栈用(整型)数组的形式呈现

2.1栈的创建

2.2压栈

2.3栈是否为空

2.4出栈

2.5获取栈中有效元素个数

2.6获取栈顶元素

2.7完整代码实现


1.栈的概念

从上图中可以看到, Stack 继承了 Vector Vector ArrayList 类似,都是动态的顺序表,不同的是 Vector 是线程安 全的。
(1)栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO Last In First Out )的原则。
(2)压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
(3)出栈:栈的删除操作叫做出栈。 出数据在栈顶
总结:先进后出

2.栈的模拟实现

1.栈的方法

2.模拟栈用(整型)数组的形式呈现

2.1栈的创建

public class MyStack {public int[] arr;public int size;public MyStack() {this.arr = new int[10];}
}

2.2压栈

(1)首先对现有栈进行判断是否为满,若满则需要进行扩容

  扩容:

private void ensureCapacity(){if(size==arr.length){arr= Arrays.copyOf(arr,size*2);}}

(2)向数组添加

public int push(int x){ensureCapacity();arr[size++]=x;return x;
}

2.3栈是否为空

public boolean empty(){return 0 == size;}

2.4出栈

(1)首先得判断栈是否为空,若为空我们需要抛出异常

自定义一个异常为EmptyException如下:

public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);}
}

(2)合法出栈

public int pop() {if(empty()) {throw new EmptyException("栈是空的!");}return arr[--size];}

2.5获取栈中有效元素个数

 public int size(){return size;}

2.6获取栈顶元素

 public int peek(){if(empty()) {throw new EmptyException("栈是空的!");}return arr[size-1];}

2.7完整代码实现

import java.util.Arrays;public class MyStack {public int[] arr;public int size;public MyStack() {this.arr = new int[10];}private void ensureCapacity(){if(size==arr.length){arr= Arrays.copyOf(arr,size*2);}}public int push(int x){ensureCapacity();arr[size++]=x;return x;}public boolean empty(){return 0 == size;}public int pop() {if(empty()) {throw new EmptyException("栈是空的!");}return arr[--size];}public int size(){return size;}public int peek(){if(empty()) {throw new EmptyException("栈是空的!");}return arr[size-1];}
}

EmptyException

public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);}
}

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

http://www.lryc.cn/news/154165.html

相关文章:

  • 深入了解GCC编译过程
  • leetcode 594.最长和谐子序列(滑动窗口)
  • 深入剖析云计算与云服务器ECS:从基础到实践
  • 苍穹外卖技术栈
  • 重新开始 杂类:C++基础
  • 自用的markdown与latex特殊符号
  • 【20期】说一说Java引用类型原理
  • 无锡布里渊——厘米级分布式光纤-锅炉安全监测解决方案
  • GREASELM: GRAPH REASONING ENHANCED LANGUAGE MODELS FOR QUESTION ANSWERING
  • QT C++ 实现网络聊天室
  • 每日一道面试题之什么是上下文切换?
  • 2023.9.3 关于 AVL 树
  • 机器学习课后习题 --- 机器学习实践
  • git常用操作
  • QT的补充知识
  • 【力扣周赛】第 360 场周赛(贪心 ⭐树上倍增)
  • 企业如何防止数据外泄——【部署智能透明加密防泄密系统】
  • 【聚类】DBCAN聚类
  • 通过安装cpolar内网穿透在Kali上实现SSH远程连接的步骤指南
  • UDP和TCP协议报文格式详解
  • STM32+UART串口+DMA收发
  • 安全基础 --- js的闭包和this属性
  • 【C语言每日一题】08. 字符三角形
  • 如何打war包,并用war包更新服务器版本
  • uniApp webview 中调用底座蓝牙打印功能异常
  • Mac下安装Jmeter及其配置
  • js+html实现打字游戏v1
  • Java on VS Code 8月更新|反编译器用户体验优化、新 Maven 项目工作流、代码高亮稳定性提升
  • 划分Vlan时需要注意的问题
  • 【广州华锐互动】利用AR远程指导系统进行机械故障排查,实现远程虚拟信息互动