欢迎访问宙启技术站
智能推送

如何使用Java实现栈的数据结构?实现什么样的函数比较有用?

发布时间:2023-06-01 00:29:36

栈是一种可以根据后进先出原则(LIFO)访问的集合,即最后加入的元素最先弹出。栈的基本操作包括push(将元素加入栈)和pop(弹出栈顶元素),以及peek(查看栈顶元素)和isEmpty(检查栈是否为空)等。在JAVA中可以使用数组或链表来实现栈数据结构。

1. 基于数组实现栈

栈的大小可能需要在创建时确定,因此使用数组实现栈更为方便。在JAVA中,可以创建一个类来表示栈数据结构:

public class Stack {

  private int[] data;

  private int size;

  private int top;

  public Stack(int size) {

    data = new int[size];

    this.size = size;

    top = -1;

  }

  public boolean isEmpty() {

    return top == -1;

  }

  public boolean isFull() {

    return top == size - 1;

  }

  public void push(int value) {

    if (!isFull()) {

      data[++top] = value;

    } else {

      System.out.println("Stack is full");

    }

  }

  public int pop() {

    if (!isEmpty()) {

      return data[top--];

    } else {

      System.out.println("Stack is empty");

      return -1;

    }

  }

  public int peek() {

    if (!isEmpty()) {

      return data[top];

    } else {

      System.out.println("Stack is empty");

      return -1;

    }

  }

}

这个类中包含了栈的常见操作, push、pop和peek,并且使用了数组存储数据。

2. 基于链表实现栈

在JAVA中,也可以使用链表实现栈数据结构。链表可以方便地增加或删除节点,从而模拟push和pop操作。

public class Node {

  int data;

  Node next;

  public Node(int data) {

    this.data = data;

    next = null;

  }

}

public class Stack {

  private Node head;

  private int size;

  public Stack() {

    head = null;

    size = 0;

  }

  public boolean isEmpty() {

    return head == null;

  }

  public void push(int value) {

    Node newNode = new Node(value);

    if (isEmpty()) {

      head = newNode;

    } else {

      newNode.next = head;

      head = newNode;

    }

    size++;

  }

  public int pop() {

    if (isEmpty()) {

      System.out.println("Stack is empty");

      return -1;

    } else {

      int value = head.data;

      head = head.next;

      size--;

      return value;

    }

  }

  public int peek() {

    if (isEmpty()) {

      System.out.println("Stack is empty");

      return -1;

    } else {

      return head.data;

    }

  }

}

在这个示例中,Node类表示链表中的每个节点,Stack类表示栈数据结构。在push操作中,创建一个新的节点,并将其插入到链表头部。在pop操作中,删除链表头部节点并返回其值。

在程序中使用栈可以实现一些非常有用的功能,例如:

1. 表达式求值。通过使用两个栈,一个存储操作符,一个存储操作数,可以实现将中缀表达式转换为后缀表达式,并求出表达式的值。

2. 括号匹配。使用栈可以轻松检测括号是否匹配。在遍历表达式时, push左括号,并在遇到右括号时 pop相应的左括号,如果不匹配则表达式无效。

3. 历史记录。可以在使用操作某个应用或浏览器时,使用栈将用户历史记录存储起来,并且可以通过 pop操作回到之前的页面。

4. 前缀表达式求值。类似于将中缀表达式转换为后缀表达式求值的方法,也可以将中缀表达式转换为前缀表达式,并求出表达式的值。

栈是一种常见的数据结构,可以在许多不同的情况下使用。在JAVA中,可以使用数组或链表来实现栈,并使用常规操作如push、pop和peek来进行操作。通过使用栈,可以实现许多实用的功能,如表达式求值、括号匹配、历史记录等。