Stacks and Queue

一、基本概念

  • 堆栈:检测最初退出的对象。后进先出,插入元素又叫入栈(push),去掉最近退出的元素又叫出栈(pop)。
  • 队列:检测最先退出的对象。先进先出,插入元素又叫入队(enqueue),去掉最近退出的元素又叫出队(dequeue)。

二、stacks:基于链表实现

指针始终指向链表的第一个节点,在最后方进行插入和删除操作

以字符串为存储对象的 stacks 举例

stack 须要实现的API

外部类

private class Node {     String item;    Node next;}

pop出栈操作
1、 保留头节点中存储的对象

String item = first.item;

2、扭转指针指向下一个节点(本来的头结点会被垃圾回收器回收)

first = first.next;

3、 返回1中保留下来的对象

return item;

push 入栈操作

1、创立一个新指针指向以后的头结点

Node oldfirst = first

2、创立一个新的头节点,并将first指针指向该节点

first = new Node();

3、给新节点设置实例变量

first.item = "not"first.next = oldfirst

三、stacks:基于链表实现的性能体现

  1. 工夫: 因为没有for循环,每个办法都只有个别指令,因而是常数项的复杂度
  2. 空间:节点数为N,则内存占用 ~40N 字节:

内存占用项占用空间(bytes)
对象头部16
外部对象额定的开销8
指向字符串的指针8
指向下一个节点的指针8

四、stacks:基于数组实现

基于数组实现的缺点
数组是有容量的,存储的数量可能超过容量,须要对其进行解决。

public class FixedCapacityStackOfStrings {    private String[] s;    private int N = 0;    //这里假如提前设置好数组大小,之后会解决这个问题    public FixedCapacityStackOfStrings(int capacity)     { s = new String[capacity]; }    public boolean isEmpty()     { return N == 0; }     public void push(String item)     // 应用以后索引插入数组,而后递增N    { s[N++] = item; }     public String pop()     // 递加N,而后应用索引拜访数组元素    { return s[--N]; } }

五、对于stacks数组实现更多的思考

数组的上溢和下溢
下溢(Underflow):从空堆栈中进行pop操作会抛出异样
上溢(Overflow):扩容数组容量(resizing array)

空值: 容许空值插入

对象游离(loitering)