一、什么是栈
栈,又叫做堆栈(Stack),但是它和堆没有关系。实际上堆和栈是两种不同的概念,栈是一种只能在一端进行插入和删除的线性数据结构。
栈的特点:先进先出(LIFO,Last In First Out),也可以说是先进后出(FILO,First In Last Out),我们只能从一端去操作元素。
一般来说,栈主要有两种操作:一个是进栈(Push),又叫做入栈,压栈;另一个是出栈(POP),或者叫退栈。
我们可以用数组去实现一个简单的栈,在下面栈的实现代码中,以整型元素为例,在Java等高级语言中,数据类型中,可以换成对象。
|
|
|
|
###栈的适用场景
- 逆序输出
由于栈有先进先出的特点,把元素顺序入栈,然后顺序出栈,就可以轻松得到逆序输出。
- 语法检查,符号成对出现
在编程语言中,{ } [ ] ( ) < > 等都是成对出现的,当遇到符号的前半部分,就进行入栈操作(PUSH),当遇到后半部分就与栈顶元素匹配(PEEK),如果相匹配,就出栈(POP),否则匹配出错。
- 数值转换
我们在进行数值转换时,最后的商需要逆序输出,用栈就可以简单的实现。当然,栈还有许多应用,比如经常听到的“函数栈”就是我们在调用方法时,计算机会执行PUSH方法,记录调用,在return的时候。就是在方法结束后,执行POP方法,完成前后对应。
二、什么是队列
队列也是一种操作受限的数据结构,插入操作只能从一端进行,这个叫队尾,移除操作只能从另一端操作,这个叫队头。
一般来说,队列的实现方式有两种,数组和链表。数组来实现有两种方式:顺序队列和循环队列。用数组实现队列,若出现队满的情况,当有新的元素需要入队的时候,可是没有位置,这时候,要么丢掉,不管它,要么等待,等待时间由程序来控制。
实现顺序队列:
|
|
|
|
###队列的适用场景:
买东西,秒杀
我们很容易想到这个场景,从网购秒杀商品,到排队买早餐。先进先出,先来先走
生产者和消费者模式
还记得生产者和消费者模式吗? 生产者负责生产,生产之后放到传送带,消费者拿下来,这个模式实现起来,无非就是存在一个队列,若干个生产者向队列增加元素,若干个消费者从队列中获取元素。