• 数据结构 | (三) Stack


    :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作
    进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO Last In First Out )的原则。
    压栈:栈的插入操作叫做进栈/ 压栈 / 入栈, 入数据在栈顶
    出栈:栈的删除操作叫做出栈。 出数据在栈顶
    栈的使用
    方法功能
    Stack()构造一个空的栈
    E push(E e)将e入栈,并返回e
    E pop()将栈顶元素出栈并返回
    E peek()获取栈顶元素
    int size()获取栈中有效元素个数
    boolean empty()检测栈是否为空

    1. public static void main(String[] args) {
    2. Stack s = new Stack();
    3. s.push(1);
    4. s.push(2);
    5. s.push(3);
    6. s.push(4);
    7. System.out.println(s.size()); // 获取栈中有效元素个数---> 4
    8. System.out.println(s.peek()); // 获取栈顶元素---> 4
    9. s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3
    10. System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3
    11. if(s.empty()){
    12. System.out.println("栈空");
    13. }else{
    14. System.out.println(s.size());
    15. }
    16. }
    栈的模拟实现
    从上图中可以看到, Stack 继承了 Vector Vector ArrayList 类似,都是动态的顺序表,不同的是 Vector 是线程安全的。
    1. public class MyStack {
    2. int[] array;
    3. int size;
    4. public MyStack(){
    5. array = new int[3];
    6. }
    7. public int push(int e){
    8. ensureCapacity();
    9. array[size++] = e;
    10. return e;
    11. }
    12. public int pop(){
    13. int e = peek();
    14. size--;
    15. return e;
    16. }
    17. public int peek(){
    18. if(empty()){
    19. throw new RuntimeException("栈为空,无法获取栈顶元素");
    20. }
    21. return array[size-1];
    22. }
    23. public int size(){
    24. return size;
    25. }
    26. public boolean empty(){
    27. return 0 == size;
    28. }
    29. private void ensureCapacity(){
    30. if(size == array.length){
    31. array = Arrays.copyOf(array, size*2);
    32. }
    33. }
    34. }
    概念区分
    栈、虚拟机栈、栈帧有什么区别呢?
    栈是一种数据结构,用于存储和管理数据。虚拟机栈是Java虚拟机中的一部分,用于执行Java方法。栈帧是虚拟机栈中的一个元素,用于存储方法的局部变量、操作数栈、动态链接和方法返回值等信息。
  • 相关阅读:
    用Rust开发一个类似SQL Server的数据库系统的步骤和关键技术
    【Python】简单的逻辑训练题目(计算机二级练习题)
    ABAP 新增PO计划行时 新增行交货日期默认当前最大交期
    百度网盘开放接口
    PowerCLI 通过vCenter批量设置所有esxi主机SNMP
    【PostgreSQL】数据类型
    游戏软件开发与应用软件开发有什么不同呢?
    当GPT遇到程序分析:在GPTScan中实现智能合约逻辑漏洞检测
    为什么同样是测试,他能年薪50W?
    如何反编译去掉安卓应用的版本更新功能
  • 原文地址:https://blog.csdn.net/khh1014173041/article/details/133684359