数据结构实现难题:使用Java实现堆栈和队列?

原创 淩亂°似流年 2024-11-22 04:57 88阅读 0赞

在Java中,我们可以使用数组或链表来实现堆栈和队列。这里我将分别解释这两种数据结构的Java实现。

  1. 堆栈(Stack):
  • 数组实现:

    1. class Stack {
    2. int[] arr;
    3. int top;
    4. Stack(int size) {
    5. arr = new int[size];
    6. top = -1;
    7. }
    8. // 入栈操作
    9. void push(int item) {
    10. if (top == arr.length - 1) {
    11. System.out.println("Stack overflow!");
    12. return;
    13. }
    14. arr[++top] = item;
    15. }
    16. // 出栈操作(获取堆栈顶元素)
    17. int pop() {
    18. if (top == -1) {
    19. System.out.println("Stack underflow!");
    20. return -1;
    21. }
    22. int item = arr[top--];
    23. return item;
    24. }
    25. // 检查栈是否为空
    26. boolean isEmpty() {
    27. return top == -1;
    28. }
    29. }
  • 链表实现(链表节点结构为:Node(int data) { this.data = data; }):

    1. class Stack {
    2. Node stack;
    3. Stack() {
    4. stack = new Node(0); // 创建一个空的堆栈
    5. }
    6. // 入栈操作
    7. void push(int item) {
    8. stack.next = new Node(item);
    9. stack = stack.next;
    10. }
    11. // 出栈操作(获取堆栈顶元素)
    12. int pop() {
    13. if (stack == null || stack.next == null) {
    14. System.out.println("Stack underflow!");
    15. return -1;
    16. }
    17. int item = stack.next.data;
    18. stack.next = stack.next.next; // 删除节点
    19. return item;
    20. }
    21. // 检查栈是否为空
    22. boolean isEmpty() {
    23. return stack == null || stack.next == null;
    24. }
    25. }
  1. 队列(Queue):
  • 数组实现:

    1. class Queue {
    2. int[] arr;
    3. int front, rear;
    4. Queue(int size) {
    5. arr = new int[size];
    6. front = 0;
    7. rear = -1; // 初始值设为-1,避免直接使用arr.length - 1
    8. }
    9. // 入队操作
    10. void enqueue(int item) {
    11. if (rear == arr.length - 1) { // 队列已满
    12. System.out.println("Queue overflow!");
    13. return;
    14. }
    15. arr[++rear] = item; // 将元素添加到数组的末尾
    16. }
    17. // 出队操作(获取队列首元素)
    18. int dequeue() {
    19. if (front == rear) { // 队列为空
    20. System.out.println("Queue underflow!");
    21. return -1;
    22. }
    23. int item = arr[front++];
    24. if (front >= rear + 1) { // 如果第一个出队的元素后不再有任何元素,则需要重新填充数组
    25. for (int i = rear + 2; i < arr.length; i++) {
    26. arr[i] = 0;
    27. }
    28. front = 0;
    29. rear = -1; // 初始值设为-1,避免直接使用arr.length - 1
    30. }
    31. return item;
    32. }
    33. // 检查队列是否为空
    34. boolean isEmpty() {
    35. return front == rear;
    36. }
    37. // 获取队列的长度
    38. int size() {
    39. return rear - front + 1;
    40. }
    41. }
  • 链表实现(链表节点结构为:Node(int data) { this.data = data; }):

    1. class Queue {
    2. Node queue;
    3. Queue() {
    4. queue = new Node(0); // 创建一个空的队列
    5. }
    6. // 入队操作
    7. void enqueue(int item) {
    8. queue.next = new Node(item);
    9. queue = queue.next;
    10. }
    11. // 出队操作(获取队列首元素)
    12. int dequeue() {
    13. if (queue == null || queue.next == null) { // 队列为空
    14. System.out.println("Queue underflow!");
    15. return -1;
    16. }
    17. int item = queue.next.data;
    18. queue.next = queue.next.next; // 删除节点
    19. queue = queue.next; // 更新队列头部
    20. return item;
    21. }
    22. // 检查队列是否为空
    23. boolean isEmpty() {
    24. return queue == null || queue.next == null;
    25. }
    26. // 获取队列的长度
    27. int size() {
    28. Node temp = queue;
    29. int count = 1; // 起始计数为1,因为数组起始位置是0
    30. while (temp != null) { // 遍历链表
    31. temp = temp.next;
    32. if (count % 2 == 1) { // 如果当前节点是奇数位(从0开始的奇数)
    33. count++; // 计数加一
    34. }
    35. }
    36. return count; // 返回队列长度
    37. }
    38. }

    以上代码实现了使用数组和链表两种数据结构实现的堆栈和队列。你可以根据需要选择使用哪种数据结构。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

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

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

相关阅读

    相关 Java数据结构--------堆栈队列

    本章相关介绍: 堆栈和队列都是特殊的线性表。线性表、堆栈和队列三者的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的插入和删除操作不受限制,而堆栈只能在栈顶插入和删除

    相关 数据结构——堆栈队列

    堆栈和队列都是特殊的线性表,线性表、堆栈和队列三者的数据元素以及数据元素之间的逻辑关系完全相同。 差别:线性表的插入和删除操作不受任何限制,而堆栈只能在栈顶插入和删除,队列

    相关 PHP使用数组实现堆栈队列

    堆栈和队列是数据结构的两种实现形式,是使用非常广泛的存储数据的容器。下面呢,就分别讲下这两种容器在PHP中的应用: 一、使用数组实现堆栈:、 1、堆栈容器中,最后进栈的将会