在Java编程中,经常会使用到栈(Stack)和队列(Queue)这两种数据结构。尽管它们都是一种基于线性的数据结构,但它们有着本质的区别。
Java栈是只能从栈顶进行插入(Push)和弹出(Pop)操作的一种数据结构。栈按照先进后出(Last In First Out,LIFO)的顺序进行操作,即最先进入的元素最后弹出,最后进入的元素最先弹出。相对于队列,栈的访问速度更快,因为只有栈顶元素可以进行访问。而栈的实现方式可以采用数组或链表。以下是一个基于数组的Java栈实现:
public class MyStack {
private int maxSize;
private int[] stackArray;
private int top;
public MyStack(int s) {
maxSize = s;
stackArray = new int[maxSize];
top = -1;
}
public void push(int j) {
stackArray[++top] = j;
}
public int pop() {
return stackArray[top--];
}
public int peek() {
return stackArray[top];
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == maxSize - 1);
}
}
Java队列是一种先进先出(First In First Out,FIFO)的数据结构。它可以在队尾进行插入(Enqueue)操作,在队头进行删除(Dequeue)操作。这可以被理解为一个管道,数据可以从一个端口进入,在另外一个端口离开。队列的实现方式可以采用数组或链表。以下是一个基于链表的Java队列实现:
class MyQueue {
private Node head;
private Node tail;
private class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
}
}
public MyQueue() {
head = null;
tail = null;
}
public void enqueue(int val) {
Node node = new Node(val);
if (tail == null) {
head = tail = node;
return;
}
tail.next = node;
tail = node;
}
public int dequeue() {
if (head == null) {
return -1;
}
int val = head.val;
head = head.next;
if (head == null) {
tail = null;
}
return val;
}
}
总的来说,Java栈和队列的主要区别在于它们的插入和删除的顺序,以及它们的实现方式。栈的访问速度更快,但队列可以用于在实现一些常用操作,如广度优先搜索等。