目录
栈和队列
栈和队列其实是操作受限的线性表。
数组、链表既可以头部插入删除,也可以尾部插入删除,也可以在任意位置插入删除。
栈和队列只能在一段插入删除元素。
一、栈(水杯型)
1.栈的概念
只能从一端插入元素,也只能从一端去除元素(栈顶)
先进后出,后进先出。从栈中取出的顺序和从栈中添加的元素顺序相反。
栈在现实生活中:
①无处不在的undo(撤销)操作(返回上一级);
②操作系统栈
2.栈的实现
基于数组实现的栈–>顺序栈
基于链表实现的栈–>链式栈
- push(E e):向栈中添加元素–>入栈,压栈
- E pop():出栈操作,弹出栈顶元素
- E peek():查看栈顶元素,但不出栈
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
/**
* 基于动态数组实现的栈
*/
public class MyStack<E> {
//记录元素个数
private int size;
//实际存储的动态数组
private List<E> data = new ArrayList<>();
/**
* 向当前栈中添加元素-->压栈操作
*/
public void push(E val) {
//数组尾部插入元素
data.add(val);
size++;
}
/**
* 出栈操作,弹出栈顶元素
*/
public E pop() {
if (data.isEmpty()) {
throw new NoSuchElementException("stack is empty! can not pop!");
}
E val = data.remove(size - 1);
size--;
return val;
}
/**
* 查看栈顶元素,不弹出
*/
public E peek() {
if (data.isEmpty()) {
throw new NoSuchElementException("stack is empty! can not peek!");
}
return data.get(size - 1);
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(data.get(i));
if (i != size - 1) {
sb.append(",");
}
}
sb.append("] top");
return sb.toString();
}
}
二、队列
栈和队列是一码事,都是对只能在线性表的一端进行插入和删除,因此,栈和队列其实可以相互转换。
1.队列的概念
队列(FIFO):先进先出的数据结构,元素从“队尾”添加,从“队首”出队。
队列在现实生活中:各式各样的“排队”操作
2.队列的实现
基于数组实现的队列–>顺序队列
基于链表实现的队列–>链式队列
(1)普通队列
链式队列更加适合队列的结构,出队列删除头结点,添加元素在链表尾部添加即可。
- offer(E val):入队列;
- peek():查看队列;
- poll():弹出队的首元素
相对于栈来说,队列实现的子类是比较多的,建立一个Queue接口:
public interface Queue<E> {
//入队操作
void offer(E val);
//出队操作
E poll();
//查看队首元素
E peek();
boolean isEmpty();
}
普通队列:
/**
* 基于链表实现的普通队列
*/