数据结构:栈和队列

栈(Stack)

栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。栈的两端分别为栈顶和栈底。

概念

  • 入栈

又称作进栈(压栈)。向一个栈插入新元素,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。

  • 出栈

又称作退栈。从一个栈删除元素,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

在这里插入图片描述

特点

先进后出(LIFO)

方法

  • E push(E item)

把item压入栈顶部

  • E pop()

移除堆栈顶部的对象,并返回该对象。

  • E peek()

查看栈顶部的对象,但不从栈中移除它。

  • boolean empty()

栈是否为空

        Deque<Integer> stack = new ArrayDeque<Integer>();
		// 压栈
		stack.push(1);
		stack.push(2);
		stack.push(3);
		stack.push(4);
		stack.push(5);
		// 遍历
		Iterator<Integer> iterator=stack.iterator();
		while(iterator.hasNext()) {
			System.out.println("--->"+iterator.next());
		}
		// 出栈
		Integer top=stack.pop();
		System.out.println("---出栈-->"+top);
		
		// 查看栈顶部的对象
		Integer peekTop=stack.peek();
		System.out.println("---栈顶-->"+peekTop);

队列

队列是一种操作受限制的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列

在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素。

在这里插入图片描述

特点

先进先出(FIFO)

方法

插入方法
  • add(e)

添加一个元素。如果队列已满,则抛出一个IIIegaISlabEepeplian异常。该方法是非阻塞的。

  • offer(e)

添加一个元素并返回true。如果队列已满,则返回false。该方法是非阻塞的。

移除方法
  • remove()

移除并返回队列头部的元素。如果队列为空,则抛出一个NoSuchElementException异常。该方法是非阻塞的。

  • poll()

移除并返问队列头部的元素。如果队列为空,则返回null。

检查方法
  • element()

返回但不移除队列的头。如果队列为空,element()抛出异常。

  • peek()

返回但不移除队列的头。如果队列为空,peek()返回null。

队列类型

概念
阻塞队列
  • 入列时,如果元素数量超过队列总数,会进行等待(阻塞),待队列的中的元素出列后,元素数量未超过队列总数时,就会解除阻塞状态,进而可以继续入列;
  • 出列时,如果队列为空的情况下,也会进行等待(阻塞),待队列有值的时候即会解除阻塞状态,进而继续出列;
  • 阻塞队列,都是线程安全的;
  • 好处是可以防止队列容器溢出;只要满了就会进行阻塞等待;也就不存在溢出的情况;
非阻塞队列
  • 入列时,如果元素数量超过队列总数,则会抛出异常;出列时,如果队列为空,则取出空值;
  • 不管出列还是入列,都不会进行阻塞。
有界

大小长度受限制

无界

大小长度不受限制。其实是有界限的,只不过超过界限时就会进行扩容,在内部动态扩容。

阻塞队列
DelayQueue
  • 延时无界的阻塞队列
  • 基于PriorityQueue
  • 在该队列中,仅当元素的延迟到期时才可以使用该元素。队头是已过期时间最长的元素。
  • 如果没有过期的延迟,则队列没有头部,此时调用poll将返回null。
  • 往队列中插入数据的操作不会被阻塞,而获取数据的操作才会被阻塞。
LinkedBlockingQueue
  • 基于链表实现的
  • 有界的阻塞队列
  • 创建LinkedBlockingQueue对象时如果不指定容量大小,则默认大小为Integer.MAX_VALUE。
ArrayBlockingQueue
  • 基于数组实现的
  • 有界阻塞队列
  • 创建ArrayBlockingQueue对象时必须制定容量大小。
PriorityBlockingQueue
  • 无界阻塞队列
  • 按照元素的优先级对元素进行排序,按照优先级顺序出队,每次出队的元素都是优先级最高的元素。
阻塞队列方法
  • take()

移除元素(从队首取元素,如果队列为空,则等待),该方法是阻塞方法。

  • put(e)

添加元素(向队尾存入元素,如果队列满,则等待),该方法是阻塞方法。

非阻塞队列
  • ConcurrentLinkedQueue

单向链表结构并发队列,由CAS实现线程安全。

  • ConcurrentLinkedDeque

双向链表结构并发队列,由CAS实现线程安全。

  • PriorityQueue

内部基于数组实现,线程不安全的队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值