栈
栈又称为堆栈,是一种运算受限的线性表,这是因为它仅允许在线性表的固定一端(表尾)进行插入、删除和读取元素等运算,不允许在其他任何位置进行运算。
相关名词:栈顶、栈顶元素、栈底、进栈(压栈)、出栈(退栈)
特点:后进先出
时间复杂度:O(1)
顺序存储结构
需要一个数组和整型变量,利用数组来存储元素,利用整型变量存储栈顶元素的下标,通常用top表示,也叫栈顶指针。
top=-1时表示栈空;
压栈时,首先将top增1,用来指代新的栈顶位置,然后把新元素赋值到栈顶位置上;
退栈时,先取出栈顶元素,然后top减1;
top指向最后一个下标位置时,栈满。若再添加元素时,需要重新分配更大的数组空间;
/**
- 栈的基本基本功能
- @author root
*/
public interface Stack {
//向栈顶插入一个元素
void push(Object obj);
//删除栈顶元素并返回
Object pop();
//返回栈顶元素
Object peek();
//是否为空
boolean isEmpty();
//清空栈内元素
void clean();
}
队列
队列简称队,也是运算受限的线性表,仅允许在表的一段插入,另一端删除。允许插入的一端做队尾,进行删除的一端做队首。
相关名词:进队、出队
特点:先进先出(FIFO)
时间复杂度:O(1)
顺序存储结构
需要一个数组和两三个变量实现。数组用来保存所有元素;需要一个变量保存队首位置(通常存储队首元素的前一个位置),也即队首指针;需要一个变量保存队尾位置,也即队尾指针;或者再添加一个变量保存元素个数。
进队:先将队尾指针后移一个位置,然后向这个位置写入新元素。如果队尾指针指向数组空间的最后一个位置时,若队首元素的前面仍有空闲位置,则表明队列没有占满整个数组空间,那么下一个存储位置为下标为0的空闲位置,因此,要先将队尾指针指向下标为0的位置,然后写入。
通过this.rear= (this.rear+1)%this.queueArray.length可以使存储队列的整个数组空间变为首尾相接的环,所以顺序存储的队列又称为循环队列。在循环队列中,存储空间是首尾相接的,当rear指向最后一个存储位置的时候,下一个位置自动转为数组空间的开始位置(即下标为0的位置)。
出队:如果队列不空,先将队首指针后移,然后返回该元素的值。队首后移也要采用取模运算,this.front= (this.front+1)%this.queueArray.length,实现首尾相接,循环利用。
队列已满的条件是队列长度为this.queueArray.length-1,也就是说必须有一个位置是空闲的。这是因为如果使用全部的数组空间,当队首和队尾指向同一个位置时,可能是空队,也可能是满队。利用队尾指针加1并对this.queueArray.length取模后是否等于队首指针作为判断满队的条件。
**
- 队列的基本功能
- @author root
*/
public interface Queue {
//进队,在队尾部插入新元素
void enter(Object obj);
//出队,从队首删除并返回对首元素
Object leave();
//返回队首元素
Object peek();
//队列是否为空
boolean isEmpty();
//清空队列
void clean();
}