栈和队列
- 都是线性表
- 操作受限制
栈(stack )又称为堆栈,它是运算受限的线性表,只能在表的一端进行插入、删除操作,不允许在其他任何位置进行插入、查找、删除等操作。
栈顶——进行插入、删除操作的一端
栈底——进行插入、删除操作的另一端
入栈——添加操作
出栈——删除操作
特点:
先进后出,后进先出
push——入栈
pop——出栈
peek——获取顶部元素
栈的存储结构可以采用顺序栈(数组)和链栈(链表)
队列(queue)——它和栈一样也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,在另一端进行删除。
插入数据这一端称为队首
删除数据这一端称为队尾
特点:
先进先出,后进后出
enqueue——入队
dequeue——出队
peek——获取队首元素
对的存储结构可以采用顺序栈(数组)和链栈(链表)
使用循环数组可以避免空间浪费
了解双端队列——deque
两边都可以入队和出队,如果某一端进行入队受限或出队受限,那么它就是受限的双端队列,在某些情况下,双端队列既可以用来做普通的队列操作也可以用来实现栈操作。
在Java中:
Stack——栈(已经过时了)
Queue——队列
Deque——双端队列,在Java中一般当做栈操作
所以Java中实现栈和队列都可以通过使用LinkedList类实现,当然底层使用的是链表。
演示:利用栈和队列实现进制转换(将十进制转换成二进制)
package dataStructure.stackqueue;
import java.util.Deque;
import java.util.LinkedList;
/**
* @author WuYongheng
* @date 2022/3/29
* @description 使用栈演示十进制转换成二进制
*/
public class TestConvert {
public static void main(String[] args) {
// 定义一个空栈
Deque deque = new LinkedList();
// 给定一个十进制数
int n = 13;
//实现转换
int t = n;
do {
// 除以2,求余数
int m = t % 2;
// 输出余数,入栈
deque.push(m);
// 除以2得到商,使用商做被除数
t = t / 2;
} while (t > 0);// 商>0
//输出二进制
System.out.print(n + "————>");
while (!deque.isEmpty()){
System.out.print(deque.pop());
}
}
}