一、队列
提到队列大家估计最先想到的都是,“数据结构”、“先进先出”啦之类的词语,其实这很好,这两点总结了队列的绝大部分特点。
队列就是一种名为线性表的数据结构,它只允许在线性表的前端进行删除操作,在线性表的后端进行插入操作(先进先出)。
在Java中如果我们想使用队列这种数据结构的话,我们是不需要自己定义的哦,我们可以使用LinkedList把它当成队列使用,因为它实现了Queue(队列)接口,根据Java中的多态,我们可以直接将Linked当做队列来使用。
1.队列的定义
Queue<引用类型> queue = new LinkedList<引用类型>();
注意队列的定义使用到了泛型,这让我们可以方便的创建各种类型的队列,不过“<>”(尖括号)里面必须是引用类型,或是基本数据类型的包装类。
例如:
Queue<Integer> queue = new LinkedList<Integer>(); Integer是int的包装类
Queue<String> queue = new LinkedList<String>();
2.“入队”(添加元素)
<1>add和offer
使用方法:
queue.offer("a");
或者是
queue.add("a");
两者在用法上没有什么区别,不过在使用时推荐使用offer()
<2>add和offer的区别
对于一些大小有限制的队列,如果在队满的情况下想要再往队列中添加新的元素,队列会拒绝。如果使用add()会得到一个unchecked的异常,然后程序结束,但是使用offer()会收到一个false的返回值,我们可以借由这个返回值去做判断,是不是队列满了,而不是直接导致程序结束。
3.“出队”(移除元素)
<1>remove和poll
使用方法:
queue.remove();
或者是
queue.poll();
两者在用法和功能上没有什么区别,都是删除一个队首元素并返回该元素的值,不过在使用
时推荐使用poll()
<2>poll和remove的区别
两个函数的功能和用法都相同,不过在使用一个空的队列调用这两个函数时,remove()会抛出一个异常,而poll会返回一个null;
4.查询头部元素
<1>elemen和peek
使用方法:
queue.element()
或者是
queue.peek()
两者在用法和功能上没有什么区别,都是返回队首元素的值,不过在使用时推荐使用peek()
<2>elemen和peek 的区别
和remove类似在队列为空时element会抛出异常,而peek会返回null
5.队列的遍历方式
<1>增强for循环
for (int num :arr){
queue.offer(num);
}
遍历结束后队列中的值不变
<2>while循环
while (!queue.isEmpty()){
System.out.println(queue.poll());
}
6.队列的其他常用方法
isEmpty() | 判断队列是否为空,空则返回true,反之false |
size() | 判断队列中的元素个数 |
二、栈
在数据结构中提到栈,我们最先想到的应该是先进后出或者(后进先出),所以栈类似于一个只开了一口的容器,容器中的元素(或者说瓶子里装的东西)叠在一起,每次取出的都是最上面的元素,也就是最后放进去的元素.
我们常会听到一些名词"栈顶","栈底","入栈","出栈","压栈"、“空栈”,那么这些操作都是什么意思呢?
1.名词解释
栈顶:线性表允许进行插入删除的那一端,在这张图里就是上面开口的那一端,位于栈顶的元素被称为栈顶元素,我们一般会定义top指针让它指向栈顶元素
栈底: 固定的,不允许进行插入和删除的另一端,图里就是封闭的一端
入栈:也叫压栈(这个可能是把子弹压入弹夹的意思哈,非常的形象),就是在栈顶添加元素的动作。
出栈:就是移除栈顶元素的动作。
空栈:是指一个没装任何元素的栈。
2.java中栈的定义
Stack<引用类型> stack = new Stack<引用类型>();
注意:和队列相同这里要用包装类
3.入栈(压栈)
stack.push("1"); stack.push("2");
4.出栈
System.out.println(stack.pop());
返回栈顶元素,并移除
5.查看栈顶元素
System.out.println(stack.peek());
返回栈顶元素,不移除
6.其他常用函数
empty() | 判断栈是否为空 |
size() | 返回栈中的元素个数 |
search() | 返回元素在栈中的位置,从1开始,若有相同元素返回第一个 |
int[] arr = {9,8,7,3,4,2,2,1};
Stack<Integer> stack = new Stack<>();
for (int num :arr){
stack.push(num);
}
System.out.println(stack.search(2));
输出:2