• Java实现栈和队列


    前言:

    🎈栈和队列是两种特有的存储数据的结构,栈是后进先出的一种结构,队列是先进先出的一种结构。

    🎈由于这种特有的结构,在选择底层存储方式也有差异。由于栈是后进先出的结构,其实就是尾删,尾增操作,如果用顺序表来存储,尾删、尾增时间复杂度则是O(1)。链表则需考虑链表的结构,如果是单链表,找尾的时间复杂度就是O(n)。如果是记录尾的双向链表,时间复杂度是O(1)。Java中也封装了这样的集合结构(Stack),用的就是顺序表。由于队列是先进先出的结构,其实就是头删,尾增操作。如果用顺序表存储,头删时间复杂度是O(n),需要挪动数据。如果用链表存储,不论是单链表还是双向链表(记录尾),头删、尾增操作时间复杂度都是O(1)。Java中也封装了这样的结构(Queue),是LinkedList实现的接口,用的是双向链表。这里用的是记录尾的单链表实现。

    🎈两种不同的结构的存在,为我们实际处理一些数据提供了便利。

    栈代码实现

    1. import java.util.Arrays;
    2. public class Mystack {
    3. private static final int DEFAULT_SIZE = 10;
    4. private int[] elem;
    5. private int top;
    6. public Mystack() {
    7. elem = new int[DEFAULT_SIZE];
    8. }
    9. //压栈
    10. public int push(int val) {
    11. if(size() == elem.length) {
    12. this.elem = Arrays.copyOf(elem, elem.length * 2);
    13. }
    14. this.elem[top] = val;
    15. this.top++;
    16. return val;
    17. }
    18. public int pop() {
    19. if(empty()) {
    20. throw new NullStackExpection("栈为空");
    21. }
    22. return this.elem[--top];
    23. }
    24. public int peek() {
    25. if(empty()) {
    26. throw new NullStackExpection("栈为空");
    27. }
    28. return this.elem[top - 1];
    29. }
    30. public int size() {
    31. return this.top;
    32. }
    33. public boolean empty() {
    34. return size() == 0;
    35. }
    36. }

    队列代码实现

    1. public class MyQueue {
    2. static class ListNode {
    3. private int val;
    4. private ListNode next;
    5. public ListNode(int val) {
    6. this.val = val;
    7. }
    8. }
    9. private int usedSize;
    10. private ListNode head;
    11. private ListNode tail;
    12. public void offer(int date) {
    13. ListNode newNode = new ListNode(date);
    14. if(head == null) {
    15. head = newNode;
    16. tail = newNode;
    17. this.usedSize++;
    18. return;
    19. }
    20. tail.next = newNode;
    21. tail = tail.next;
    22. this.usedSize++;
    23. }
    24. public int poll() {
    25. if(empty()) {
    26. throw new NullQueueExpection("空队列");
    27. }
    28. //只有一个节点特殊处理
    29. if(head.next == null) {
    30. int tmp = head.val;
    31. head = null;
    32. tail = null;
    33. this.usedSize--;
    34. return tmp;
    35. }
    36. int tmp = head.val;
    37. head = head.next;
    38. this.usedSize--;
    39. return tmp;
    40. }
    41. public int peek() {
    42. if(empty()) {
    43. throw new NullQueueExpection("空队列");
    44. }
    45. return this.head.val;
    46. }
    47. public int size() {
    48. return this.usedSize;
    49. }
    50. public boolean empty() {
    51. return this.usedSize == 0;
    52. }
    53. }

    小结:

    🐵我们需熟悉这样的数据结构,理解底层存储原理,在实际对数据操作中才能得心应手。

  • 相关阅读:
    企业数字化转型的测度难题:基于大语言模型的新方法与新发现
    学习MySQL的第六天:事务(基础篇)
    Es Ik
    297. 二叉树的序列化与反序列化
    【Go入门】Web工作方式
    功能上线回滚考虑
    html5
    JavaScript总结
    我的PFC岩土颗粒流离散元分析攻略(附赠学习资料)
    NFT营销如何赋能品牌破圈增长?
  • 原文地址:https://blog.csdn.net/weixin_62353436/article/details/127107277