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

Java中的数据结构函数:栈、队列、链表

发布时间:2023-06-18 23:21:03

Java中的数据结构函数主要包括栈、队列和链表。这三个数据结构在Java中都有相应的类和方法来实现。下面我们将详细介绍这三个数据结构的定义、特点以及常用的方法。

一、栈

栈是一种后进先出(Last In First Out,简称LIFO)的数据结构。简单来说,就是最后进去的元素最先弹出(取出)。栈可以通过数组或链表来实现。在Java中,可以使用Stack类来实现栈。

1. Stack类

Stack类是Java中用来表示栈的类。这个类继承了Vector类,提供了一些用于栈操作的方法。下面是Stack类中常用的一些方法:

方法名|方法说明

---|---

void push(E item)|将元素压入栈顶

E pop()|从栈顶弹出元素

E peek()|查看栈顶元素,但不弹出

boolean isEmpty()|判断栈是否为空

int search(Object o)|查找元素在栈中的位置,如果不存在返回-1

2. 栈的应用

栈在编程中有广泛的应用,例如实现函数调用的堆栈、表达式求值、括号匹配等。下面是一些常见的应用:

(1)表达式求值

如何利用栈来求一个表达式的值呢?我们可以将常量、运算符和括号进行分类,如遇到常量则将其放入栈中,遇到运算符就从栈中弹出两个元素进行计算,将结果重新放回栈中,遇到括号就进行递归操作。

例如,对于表达式1+2*3-4,我们可以利用如下伪代码来求值:

stack = new Stack();

for(char c : expression){
    if(c is digit){
        push(stack, c);
    }
    else if( c is operator){
        a = pop(stack);
        b = pop(stack);
        push(stack, a operator b);
    }
}

result = pop(stack);

(2)括号匹配

对于一个表达式,如果其中的括号没有按照规则进行匹配,则可能会导致解释错误。例如,“(1+2)*3”是合法的,而“(1+2*3”或“1+(2+3))*4”则不合法。

可以用栈来实现括号匹配的功能。当遇到左括号时,将其压入栈中,当遇到右括号时,从栈中弹出左括号,检查是否匹配。

以下是括号匹配的示例代码:

String expression = "((1+2)*3)";
Stack<Character> stack = new Stack<Character>();

for(char c : expression.toCharArray()){
    if(c == '('){
        stack.push(c);
    }
    else if(c == ')'){
        if(stack.isEmpty() || stack.pop() != '('){
            System.out.println("Not match!");
            return;
        }
    }
}

if(!stack.isEmpty()){
    System.out.println("Not match!");
    return;
}

System.out.println("Match!");

二、队列

队列是一种先进先出(First In First Out,简称FIFO)的数据结构。简单来说,就是最先进去的元素最先弹出(取出)。队列可以通过数组或链表来实现。在Java中,可以使用Queue类来实现队列。

1. Queue类

Queue类是Java中用来表示队列的接口。这个接口定义了一些用于队列操作的方法。下面是Queue接口中常用的一些方法:

方法名|方法说明

---|---

boolean add(E e)|向队列末尾添加一个元素,添加成功返回true,添加失败抛出异常

boolean offer(E e)|向队列末尾添加一个元素,添加成功返回true,添加失败返回false

E remove()|从队列头部弹出一个元素,如果队列为空抛出异常

E poll()|从队列头部弹出一个元素,如果队列为空返回null

E element()|查看队列头部元素,但不弹出,如果队列为空抛出异常

E peek()|查看队列头部元素,但不弹出,如果队列为空返回null

2. 队列的应用

队列在编程中有广泛的应用,例如消息队列、任务队列、事件队列等。下面是一些常见的应用:

(1)实现缓冲区

我们可以通过队列来实现一个缓冲区。当有新的数据到来时,将其添加到队列的末尾。当需要处理这些数据时,从队列的头部弹出一个数据进行处理。这样就可以保证数据的顺序,并且不会受到后续数据的干扰。

(2)实现事件循环

事件循环是一种常见的编程模式,用于处理IO操作、事件处理等任务。它的核心思想就是通过队列来存储待处理的事件,然后按照队列的顺序逐个处理这些事件。在Java中,可以使用SwingWorker来实现事件循环的功能。

三、链表

链表是一种由一系列节点组成的数据结构,每个节点包含一个数据和指向下一个节点的指针。链表可以用来表示各种不同的数据结构,例如栈、队列、树等。在Java中,可以使用LinkedList类来实现链表。

1. LinkedList类

LinkedList类是Java中用来表示链表的类。这个类实现了List接口和Deque接口,提供了一些用于链表操作的方法。下面是LinkedList类中常用的一些方法:

方法名|方法说明

---|---

void addFirst(E e)|在链表头部添加一个元素

void addLast(E e)|在链表尾部添加一个元素

E getFirst()|查看链表头部元素,但不移除,如果链表为空抛出异常

E getLast()|查看链表尾部元素,但不移除,如果链表为空抛出异常

E removeFirst()|从链表头部移除第一个元素,如果链表为空抛出异常

E removeLast()|从链表尾部移除最后一个元素,如果链表为空抛出异常

2. 链表的应用

链表在编程中有广泛的应用,例如实现树、图等数据结构,实现队列、栈等数据结构,实现文件管理、内存管理等系统功能。下面是一些常见的应用:

(1)实现树

树是一种常见的数据结构,可以用于存储数据、实现搜索等。在Java中,可以使用LinkedList类来实现树的节点。

例如,下面是一棵二叉树的示例代码:

`

class TreeNode{

int val;

TreeNode left;

TreeNode right;

public TreeNode(int val){

this.val = val;

left = null;

right = null;

}

}

public class BinaryTree{

private TreeNode root;

public BinaryTree(TreeNode root){

this.root = root;

}

public void preOrder(TreeNode node){

if(node == null){

return;

}

System.out.print(node.val + " ");

preOrder(node.left);

preOrder(node.right);

}

public void inOrder(TreeNode node){

if(node == null){

return;

}

inOrder(node.left);

System.out.print(node.val + " ");

inOrder(node.right);

}

public void postOrder(TreeNode node){

if(node == null){

return;

}

postOrder(node.left);

postOrder(node.right);

System.out.print(node.val + " ");

}

public static void main(String[] args){

TreeNode root = new TreeNode(1);

root.left = new TreeNode(2);