Java中的数据结构函数:栈、队列、链表
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);
