栈和队列
一、栈:
1.概念:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
2.实现:
- 利用顺序表实现,即使用尾插 + 尾删的方式实现
- 利用链表实现,则头尾皆可
(优先使用顺序表)
import java.util.Arrays;
public class Stack {
private int[] array;
private int top;
public Stack(int defaultCapacity) {
array = new int[defaultCapacity];
top = 0;
}
public Stack() {
this(20);
}
//插入栈顶元素
public void push(int val) {
if (top == array.length) {
array = Arrays.copyOf(array, array.length * 2);
}
array[top++] = val;
}
//删除栈顶元素
public void pop() {
if (top <= 0) {
System.out.println("栈为空,无法删除");
return;
}
top--;
array[top] = 0; // 可加可不加,把所有空的位置保持为 0
}
//返回栈顶元素
public int top() {
if (top <= 0) {
System.out.println("栈为空,无法返回栈顶元素");
return -1;
}
return array[top - 1];
}
public int size() {
return top;
}
//判断是否为空
public boolean isEmpty() {
return top == 0;
}
}
二、队列
1.概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
2.实现:
class Node {
int val;
Node next;
Node(int val, Node next) {
this.val = val;
this.next = next;
}
Node(int val) {
this(val, null);
}
}
public class Queue {
private Node front = null; // 链表的第一个结点
private Node rear = null; // 链表的最后一个结点
private int size = 0;
// 尾插
public void push(int val) {
Node node = new Node(val);
if (front == null) {
front = node;
} else {
rear.next = node;
}
rear = node;
size++;
}
// 头删
public void pop() {
if (size <= 0) {
System.out.println("队列为空");
return;
}
front = front.next;
if (front == null) {
rear = null;
}
size--;
}
public int front() {
if (size <= 0) {
System.out.println("队列为空");
return -1;
}
return front.val;
}
public int rear() {
if (size <= 0) {
System.out.println("队列为空");
return -1;
}
return rear.val;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
}