栈和队列


栈又称为堆栈,是一种运算受限的线性表,这是因为它仅允许在线性表的固定一端(表尾)进行插入、删除和读取元素等运算,不允许在其他任何位置进行运算。

相关名词:栈顶、栈顶元素、栈底、进栈(压栈)、出栈(退栈)

特点:后进先出

时间复杂度: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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值