栈和队列
栈
栈是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
通常栈的开口端被称为栈顶;相应地,封口端被称为栈底。
进栈和出栈
基于栈结构的特点,通常只会对栈执行以下两种操作:
- 向栈中添加元素,此过程被称为"进栈"(入栈或压栈);
- 从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);
栈的具体实现
public class Stack<T> {
private ArrayList<T> list;
private int size;
public Stack(int size) {
this.size = size;
this.list = new ArrayList<T>(size);
}
}
进栈
public void push(T t){
if(this.list.size() > this.size){
throw new RuntimeException("No enough memory...");
}else{
this.list.add(t);
}
}
出栈
public T pop(){
if(this.list.size()>0){
T t = this.list.get(this.list.size()-1);
this.list.remove(this.list.size()-1);
return t;
}else {
throw new RuntimeException("Stack isEmpty...");
}
}
取得栈顶元素
public T getTop(){
if(this.list.size()>0){
return this.list.remove(this.list.size()-1);
}else {
throw new RuntimeException("Stack isEmpty...");
}
}
是否为空
public boolean isEmpty(){
return this.list.size() == 0;
}
队列
和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出。
通常,进数据的一端为 “队尾”,出数据的一端为 “队头”,数据元素进队列的过程称为 “入队”,出队列的过程称为 “出队”。
栈结构是一端封口,特点是"先进后出";而队列的两端全是开口,特点是"先进先出".
队列的实现
class Queue<T>{
private ArrayList<T> list;
private int front;
private int rear;
private int length;
public Queue(){
front = 0;
rear = 0;
length = 0;
list = new ArrayList<T>();
}
}
进队
public void add(T t){
list.add(t);
length++;
rear++;
}
出队
public T remove() {
if (length > 0) {
T t = list.get(front);
front++;
length--;
return t;
}else{
throw new RuntimeException("Queue isEmpty...");
}
}
获取队头元素
public T getFront(){
if (length > 0) {
return list.get(front);
}else {
throw new RuntimeException("Queue isEmpty...");
}
}
是否为空
public boolean isEmpty() {
return this.rear == this.front && length == 0;
}