栈
概念
-
栈:又称堆栈,是运算受限的线性表。
-
仅允许在表的一端插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。
-
表中进行插入、删除操作的一端称为栈顶,栈顶保存的元素称为栈顶元素,相对的,表的另一端称为栈底。
-
当栈中没有元素的时称为空栈。
特点
-
由于栈的插入和删除操作仅在栈顶进行,所以后入栈的必定先出
-
LIFO(last in frist out) 后进先出
-
跟栈操作相关:push ,pop ,peek(获取栈顶元素)
public interface Stack{ public int getSize();//返回堆栈的大小 public boolean isEmpty();//判断堆栈是否为空 public void push(Object e);//将元素e压栈 public Object pop();//栈顶元素出栈 public Object peek();//取栈顶的元素 }
栈的存储结构
顺序栈
- 使用顺序存储结构实现的堆栈,即用一组地址连续的存储单元依次存放堆栈中的数据元素。
- 由于堆栈是一种特殊的线性表,因此在线性表的顺序存储结构的基础上,选择线性表的一端作为栈顶即可
- 根据数组操作的特性,选择数组下标大的一端,即线性表顺序存储的表尾作为栈顶
- 由于堆栈的操作都是在栈顶完成的,因此在顺序栈的实现中需要附设置一个指针top来动态的只是栈顶元素在数组中的位置
- 通常top可以用栈顶元素所在的数组下标来表示,top=-1,表示空栈。
链栈
- 链栈采用链表作为存储结构实现的栈。
- 当采用单链表存储线性表后,根据单链表的操作特性选择单链表的头部作为栈顶
- 由于栈顶的操作只在线性表的一端进行,在这里用带头结点的单链表或者不带头结点的单链表都可以
- 使用带头结点的单链表时,结点的插入和删除都在头结点之后进行
- 使用不带头结点的单链表时,,结点的插入和删除都在链表的首结点上进行
队列
概念
- 简称队,它同堆栈一样,也是一种运算受限制的线性表
- 其限制是仅允许在表的一端进行插入
public interface Queue{ public int getSize(); public boolean isEmpty(); public void enqueue(Object e);元素e入队 public Object dequeue();队首元素出队 public Object peek(); }
顺序队列
方法一:数组作为存储结构
- 有头指针和尾指针
- 如果有元素出队列,那么头指针之前的空间就不能用了,导致大量的空间浪费。
方法二:使用过循环数组作为存储结构
- 末尾元素的下一个元素不是数组外,而是数组的头元素,这样就能使用头指针之前的元素了
链式队列
- 队列的链式存储可以使用带头结点单链表来实现
- 链表的头部作为队首,链表的尾部作为队尾
- 需要有指向链表头节点和链表尾结点的引用
- 设计了两个指针,一个队首指针和一个队尾指针
- 队首指针指向队首元素的前一个空结点,队尾指针指向队尾元素所在的结点
- 空队列的时候,队首和队尾指针都指向空的头节点。
- 入队的时候,最后的元素指向新入栈元素,指针后移到新元素的结点
- 出队列的时候,头结点指向第二个元素的结点,把第二个元素当作是新的队首
双端队列deque(double ended queue)
-
所谓双端队列就是两端都可以进行入队和出队操作的队列
-
双端队列:进队的时候,前端进的元素排在后端进的元素的前面;出队的时候,无论前端出还是后端出,先出的元素排在后出元素的前面。
-
输出受限的双端队列:一个端点允许插入和输出,另一个端点只允许插入。
-
输入受限的双端队列:一个端点允许插入和输出,另一个端点只允许输出。
-
如果一端只允许进,另一端只允许出,普通的链表
-
如果只允许一端插入和输出,另一端不允许操作,则是栈
-
java中的线性表:vector,Array List,LinkedList
-
Java中的栈和队列:Stack extends Vector(overtime),Queue接口,Deque栈操作时建议用。
代码分析
Deque 继承 Queue
子类有Array Queue(用的不多) 和 LikedList
LikedList既可以当作占用,也可以当作队列,还可以当作线性表
- 用栈操作实现十进制转化为二进制
public static void main(String[] args) { Deque stack = new LinkedList(); Scanner sc = new Scanner(System.in); System.out.println("please click zhe number you want:"); int m = sc.nextInt(); int t = m; while(t>0){ int mod = t % 2; stack.push(mod); t = t/2; } System.out.print(m+"的二进制是:"); while (!stack.isEmpty()){ System.out.print(stack.pop()); } }