本章主要介绍栈、队列
栈、队列与数组结构类型差异性
数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,本章所讲的数据结构和算法更多地是作为程序员工具来使用,主要作为构思算法的辅助工具。这些数据结构的生命周期比数据库类型的结构要短得多,在程序执行期间它们才被创建,通常用它们去执行某项特殊的业务,执行完成之后,它们就被销毁。
数组知道下标可直接访问数据项或者顺序搜索数据项,访问到数组中的各数据项,本章中数据结构是访问受限的,在特定时刻只有一个数据项可以被读取或者删除。
栈、队列、优先级比数组和其他数据存储结构更加抽象。主要通过接口对它们进行定义,接口表明了通过它们可以完成的操作,而主要实现机制对用户来说不可见。
一、栈
1.栈的特点
只能在一端进行插入和删除,后进先出,线性表。
2.栈使用场景
①单词逆序
public static void stringReverse(){
Stack stack = new Stack();
String str = "andy lau";
char[] cha = str.toCharArray();
for(char c : cha){
stack.push(c);
}
while(!stack.isEmpty()){
System.out.print(stack.pop());
}
}
②分隔符匹配
public static void delimiterMatch(){
Stack stack = new Stack();
String str = "12<a[b{c}]>";
char[] cha = str.toCharArray();
for(char c : cha){
switch (c) {
case '{':
case '[':
case '<':
System.out.println(c);
stack.push(c);
break;
case '}':
case ']':
case '>':
System.out.println(c);
if(!stack.isEmpty()){
char ch = stack.pop().toString().toCharArray()[0];
if(c=='}' && ch != '{'
|| c==']' && ch != '['
|| c==')' && ch != '('){
System.out.println("Error:"+ch+"-"+c);
}
}
break;
default:
System.out.println(c);
break;
}
}
}
3.栈的效率:数据项入栈和出栈时间复杂度为常数O(1),栈操作所耗时间不依赖于栈中数据项个数,因此操作时间很短,栈不需要比较和移动操作。
二、队列
队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO)线性表。
队列类型:
①、单向队列(Queue):只能在一端插入数据,另一端删除数据。
②、双向队列(Deque):每一端都可以进行插入数据和删除数据操作。
③、优先级队列:优先级队列的数据项按照关键字进行排序,关键字最小(或者最大)的数据项往往在队列的最前面,而数据项在插入的时候都会插入到合适的位置以确保队列的有序。
队列简介:
https://www.cnblogs.com/ysocean/p/7921930.html
总结:
本章主要介绍了队列的三种形式,分别是单向队列、双向队列以及优先级队列。其实大家听名字也可以听得出来他们之间的区别,单向队列遵循先进先出的原则,而且一端只能插入,另一端只能删除。双向队列则两端都可插入和删除,如果限制双向队列的某一段的方法,则可以达到和单向队列同样的功能。最后优先级队列,则是在插入元素的时候进行了优先级别排序,在实际应用中单项队列和优先级队列使用的比较多。后面讲解了堆这种数据结构,我们会用堆来实现优先级队列,改善优先级队列插入元素的时间。
①、栈、队列(单向队列)、优先级队列通常是用来简化某些程序操作的数据结构,而不是主要作为存储数据的。
②、在这些数据结构中,只有一个数据项可以被访问。
③、栈允许在栈顶压入数据,在栈顶弹出数据,但是只能访问最后一个插入的数据项,也就是栈顶元素。
④、队列(单向队列)只能在队尾插入数据,对头删除数据,并且只能访问对头的数据。而且队列还可以实现循环队列,它基于数组,数组下标可以从数组末端绕回到数组的开始位置。
⑤、优先级队列是有序的插入数据,并且只能访问当前元素中优先级别最大(或最小)的元素。
⑥、这些数据结构都能由数组实现,也可以用别的机制(链表、堆等)实现。