当前位置:   article > 正文

数据结构之栈(超详细)java实现_java数据结构栈

java数据结构栈

栈的定义

栈是一种数据结构,它是一种受限制的线性表,只能在一端添加或删除元素,具有特定的操作规则。栈的特点是先进后出(LIFO,Last In First Out),即最后入栈的元素最先出栈,而最先入栈的元素最后出栈

栈只能在一端删除或者添加元素,这一端称为栈顶

另外一端称为栈底

   生活中类似的栈结构 

  1. 在超市购物时,将购买的商品放入购物篮或购物车中,形成一层一层的堆叠,就像是在组织一个临时的栈结构。

  2. 在餐厅用餐时,将盘子一层一层地叠放在餐桌上,然后按照用餐的顺序依次清理,就像是在处理一个栈结构。

  3. 在电脑中,浏览器的后退按钮就是一个栈结构,每次点击后退按钮就会返回上一个浏览页面,就像是在操作一个栈结构。

 栈的使用:

  java已经给我们提供了实现类 Stack

 

  1. empty(): 这个方法通常用于检查栈是否为空。

  2. peek(): 返回栈顶的元素但不移除它。

  3. pop(): 移除并返回栈顶的元素。

  4. push(element): 将指定的元素压入栈顶。

  5. search(element): 在栈中搜索指定的元素并返回其位置,其中最顶部的元素位置为1。

 代码示例

  1. package stack;
  2. import java.util.Stack;
  3. public class test {
  4. public static void main(String[] args) {
  5. Stack<Integer> stack = new Stack<Integer>();
  6. // 将元素压入栈
  7. stack.push(5);
  8. stack.push(10);
  9. stack.push(15);
  10. // 查看栈顶元素
  11. System.out.println("栈顶元素: " + stack.peek());
  12. // 弹出栈顶元素
  13. int poppedElement = stack.pop();
  14. System.out.println("弹出的元素: " + poppedElement);
  15. // 检查栈是否为空
  16. System.out.println("栈是否为空? " + stack.isEmpty());
  17. // 搜索元素
  18. int index = stack.search(10);
  19. System.out.println("元素10在栈中的位置: " + index);
  20. }
  21. }

运行结果:

      

 模拟栈实现

    顺序栈 

          顺序栈使用数组实现,可以用动态数组arraylist,也可以用静态数组,我这里采用后者

          我这里初始化栈顶指针为-1,代表当前栈顶指针永远指向当前元素,有的小伙伴可能会初始化栈   顶指针为0,代表栈顶指针永远指向当前元素的下一个元素

          栈的初始化
  1. private int top;//栈顶指针
  2. private int maxSize;//最大长度
  3. private int[] arr;
  4. public ArrayStack() {
  5. this.top = -1; // 栈顶指针
  6. maxSize = 5; // 初始最大长度
  7. arr = new int[maxSize];
  8. }
     判断栈是否为空

          如果当前栈顶指针等于初始值-1,那这个栈就是空的,这个没有什么好说的,如果刚开始初始化栈顶指针等于0,那么这里就应该判断栈顶指针是否等于0

  1. public boolean isEmpty() {
  2. return top == -1;
  3. }
 判断栈是否满 

       只要当前栈顶指针等于最大长度等于maxsize-1,那么这个栈就满了, 如果刚开始初始化栈顶指针等于0,那么这里就应该判断栈顶指针是否等于maxsize,而不是maxsize-1;

  1. public boolean isFull() {
  2. return top == maxSize - 1;
  3. }
入栈

入栈之前一定要判断栈是否满了,满了就扩容,如果用的是动态数组,就不需要自己扩容,程序会帮你扩容  然后后移指针

  1. public void push(int data) {
  2. // 判断栈满
  3. if (isFull()) {
  4. // 扩容,扩大到原来的两倍
  5. int[] newArray = Arrays.copyOf(arr, 2 * arr.length);
  6. arr = newArray;
  7. maxSize = 2 * maxSize;
  8. }
  9. arr[++top] = data;
  10. }
 出栈

 出栈的话,一定要先保存当前指针值,然后再前移指针

  1. public int pop() {
  2. if (isEmpty()) {
  3. throw new EmptyStackException();
  4. } else {
  5. int val = arr[top];
  6. top--;
  7. return val;
  8. }
  9. }
 取栈顶元素

 取栈顶元素和出栈差不多,只不过出栈需要移动栈顶指针

  1. public int peek() {
  2. if (isEmpty()) {
  3. throw new EmptyStackException();
  4. } else {
  5. int val = arr[top];
  6. return val;
  7. }
  8. }
完整代码 
  1. class ArrayStack {
  2. private int top;//栈顶指针
  3. private int maxSize;//最大长度
  4. private int[] arr;
  5. public ArrayStack() {
  6. this.top = -1; // 栈顶指针
  7. maxSize = 5; // 初始最大长度
  8. arr = new int[maxSize];
  9. }
  10. // 入栈
  11. public void push(int data) {
  12. // 判断栈满
  13. if (isFull()) {
  14. // 扩容,扩大到原来的两倍
  15. int[] newArray = Arrays.copyOf(arr, 2 * arr.length);
  16. arr = newArray;
  17. maxSize = 2 * maxSize;
  18. }
  19. arr[++top] = data;
  20. }
  21. // 出栈
  22. public int pop() {
  23. if (isEmpty()) {
  24. throw new EmptyStackException();
  25. } else {
  26. int val = arr[top];
  27. top--;
  28. return val;
  29. }
  30. }
  31. //取栈顶元素
  32. public int peek() {
  33. if (isEmpty()) {
  34. throw new EmptyStackException();
  35. } else {
  36. int val = arr[top];
  37. return val;
  38. }
  39. }
  40. // 判断满
  41. public boolean isFull() {
  42. return top == maxSize - 1;
  43. }
  44. // 判断非空
  45. public boolean isEmpty() {
  46. return top == -1;
  47. }
  48. }

    链表栈

链表栈和数组实现的栈的基本功能是相似的,都是遵循后进先出(LIFO)的原则。不过,链表栈不需要像数组实现的栈一样进行判断是否已满,也不需要扩容。这是因为链表在内存中可以动态地分配空间,因此可以根据需要动态地增加或减少节点,从而避免了数组实现的栈可能遇到的容量限制和扩容问题。

 这里直接上完整代码

我这里用到是泛型类 

  1. class LinkedListStack<T> {
  2. private Node<T> head;
  3. // 入栈
  4. public void push(T data) {
  5. // 头插法
  6. head = new Node<>(data, head);
  7. }
  8. // 出栈
  9. public T pop() {
  10. if (isEmpty()) {
  11. throw new IllegalStateException("Stack is empty");
  12. }
  13. T data = head.data;
  14. head = head.next;
  15. return data;
  16. }
  17. // 打印栈顶元素
  18. public T peek() {
  19. if (isEmpty()) {
  20. throw new IllegalStateException("Stack is empty");
  21. }
  22. return head.data;
  23. }
  24. // 判断栈为空
  25. public boolean isEmpty() {
  26. return head == null;
  27. }
  28. // 节点类
  29. private static class Node<T> {
  30. T data;
  31. Node<T> next;
  32. public Node(T data, Node<T> next) {
  33. this.data = data;
  34. this.next = next;
  35. }
  36. }
  37. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/876658
推荐阅读
相关标签
  

闽ICP备14008679号