栈(Stack)

不念不忘少年蓝@ 2023-10-02 12:43 105阅读 0赞

一,概念

  • 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则
  • 栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
  • 栈的删除操作叫做出栈。出数据在栈顶

二,栈的操作

代码示例:" class="reference-link">e86a85e1b0d44d4fa480a7cee6d95db0.png 代码示例:

  1. public class MyStack {
  2. public static void main(String[] args) {
  3. Stack s = new Stack();
  4. //入栈
  5. s.push(1);
  6. s.push(2);
  7. s.push(3);
  8. s.push(4);
  9. s.push(5);
  10. s.push(6);
  11. //获取栈顶元素 (栈中元素遵循后进先出,因此元素为:1,2,3,4,5,6)
  12. System.out.println(s.peek());
  13. //获取有效元素的个数 (一共有六个元素,因此为;6)
  14. System.out.println(s.size());
  15. //出栈(获取并取出) (出栈并检测栈顶元素和栈中元素的个数)
  16. System.out.println(s.pop()); // 6
  17. System.out.println(s.pop()); // 5
  18. System.out.println(s.pop()); // 4
  19. System.out.println(s.pop()); // 3
  20. System.out.println(s.peek()); // 2
  21. System.out.println(s.size()); // 2
  22. //判断栈里面是否为空
  23. if(!s.empty()){
  24. System.out.println("栈不为空!");
  25. }else {
  26. System.out.println("栈为空!");
  27. }
  28. System.out.println(s.pop());
  29. System.out.println(s.pop());
  30. if(!s.empty()){
  31. System.out.println("栈不为空!");
  32. }else {
  33. System.out.println("栈为空!");
  34. }
  35. }
  36. }

运行结果:

4c0381cca8984eed9b1b83748c30e52f.png

三,栈的应用实例

逆序打印链表

思路:可以借用栈的特性“后进先出”,后入栈的先出去

  1. public void print(ListNode head){
  2. if(head == null){
  3. System.out.println("链表为空!");
  4. }
  5. ListNode cur = head;
  6. Stack s = new Stack();
  7. while(cur != null){
  8. s.push(cur.val);
  9. cur = cur.next;
  10. }
  11. while(!s.empty()){
  12. System.out.print(s.pop() + " ");
  13. }
  14. System.out.println();
  15. }

在剑指刷题中,有两种做法,普通数组逆序,和利用栈的逆序

四,栈的模拟实现

  1. public static class Stack<E> {
  2. E[] array;
  3. int size; // 用来表示栈中总共有多少个元素 || size-1表示栈顶元素的位置
  4. public Stack(){
  5. array = (E[])new Object[3];
  6. size = 0;
  7. }
  8. public void push(E e){
  9. // 1. 先确保栈中空间足够
  10. ensureCapacity();
  11. // 2. 插入元素
  12. array[size] = e;
  13. size++;
  14. }
  15. public E pop(){
  16. E ret = peek();
  17. size--;
  18. return ret;
  19. }
  20. public E peek(){
  21. if(empty()){
  22. throw new RuntimeException("pop: 栈是空的");
  23. }
  24. return array[size-1];
  25. }
  26. public boolean empty(){
  27. return 0 == size;
  28. }
  29. public int size(){
  30. return size;
  31. }
  32. private void ensureCapacity(){
  33. if(size == array.length){
  34. int newCapacity = size*2;
  35. array = Arrays.copyOf(array, newCapacity);
  36. }
  37. }
  38. public static void main(String[] args) {
  39. Stack<String> s = new Stack<>();
  40. s.push("11");
  41. s.push("22");
  42. s.push("33");
  43. s.push("44");
  44. s.push("55");
  45. s.push("66");
  46. s.push("77");
  47. System.out.println(s.size());
  48. System.out.println(s.peek());
  49. s.pop();
  50. s.pop();
  51. System.out.println(s.size());
  52. System.out.println(s.peek());
  53. }
  54. }

ae9bed07f58a49099adb6449d145b02e.png

五,栈,虚拟机栈,栈帧的区别

栈:一般认为时一种数据结构,它继承了vector,在java集合中实现了Stack,也是线程安全的

虚拟机栈: 具有特殊作用的一块内存,jvm为了更好的管理数据,将内存按照不同的需求划分出来的一种结构(堆区,栈区)

栈区是线程私有的,存放的是一些有关于函数调用的信息,主要是栈帧,如果栈区内存不够时,会抛出StackoverflowException的异常,当中的元素(栈帧)是按照数据结构中栈的特性来实现的

栈帧:一种与函数调用有关的结构,如,局部变量,操作数栈。每个方法在调用时,jvm都会创建一个栈帧,将栈帧压入到虚拟机栈中,当方法调用结束时,对应的栈帧就会从虚拟机栈中出栈

发表评论

表情:
评论列表 (有 0 条评论,105人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Stack

    一,概念 > 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO

    相关 C++stack

    栈:栈是一种数据结构,存储以及查找数据时只能访问栈的一端。栈后进先出(LIFO, last in first out) 栈的操作包括: Clear() ——清空栈 IsE

    相关 数据结构:(linked-stack & array-stack)

    栈是一种特别的线性表。在栈中,只能在数据的一端(即栈顶)进行操作。最经典的解释这个策略的例子就是叠盘子。盘子只能一个一个不断放在之前的盘子堆上,拿盘子的时候也只能从上往下一个一

    相关 stack

    1.什么是栈? 栈(stack)是一种只能在表的一端进行插入和删除的线性表。是一种一对一的线性关系。因为只能在栈顶进行插入和删除.这种结构特性决定了栈只能的性质:后进先

    相关 JavaStack

    当我们目空所极,认为望穿一切时,我们才发现我们是多么的可悲的井底之蛙。有些java学者,认为自己已经把java学的出神入化了,这本身就是一种多么可悲的自大啊,在你用到的,你或许

    相关 JVM--Stack

    栈(Stack) 栈也叫栈内存,主管java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题, 只要线程

    相关 Stack()

    【一】Stack(栈) > 特点:它是一个先进后出的有序列表 >     允许插入和删除的一端为栈顶(top),另一端为栈底(bottom) >     出栈pop,