栈和队列(Stack和Queue)
1:栈的概念
示意图:
2:创建一个类Stack,给定一个整形数组elem,数组已使用长度usedSize,默认长度default_size为10,再给定一个构造方法,初始化数组,将长度定为10。
3:push方法:新增元素
4:isFull方法:判断数组是否满了
5:pop方法:将栈顶元素出栈并返回
6:isEmpty方法:判断数组是否为空
7:peek方法:获取栈顶元素
8:reversePrintList方法:用栈逆序打印链表
示意图:
主要思路:先通过while循环把链表的结点都放入stack中,再通过while循环把stack的栈顶元素一个一个拿出来,打印数值,实现链表的逆序打印。
在main方法中运行:
输出结果:
9:isProper方法:出栈入栈次序匹配
第一个序列表示栈的压入顺序,判断第二个序列是否可能为栈的弹出顺序。
主要思路:把pushA数组的元素放入栈stack中,如果栈顶元素在循环遍历中与popA数组的元素匹配,且匹配完成后stack为空就代表全部配对成功。
在Test类main方法中调用:
将stack转换为整形数组array,并调用isProper方法。
输出结果:
10:最小栈
获取栈内的最小元素。
示意图:
push方法:往栈里放元素
先放stack,如果minStack为空,也放入。如果放入的元素小于minStack的栈顶元素,也放入minStack。
pop方法:取出栈顶元素
先取stack的栈顶元素,如果和minStack的栈顶元素一样,那么minStack也要取出栈顶元素。
获取stack和minStack栈顶元素:
在Test类main方法中调用:
输出结果:
1:队列的概念(Queue)
示意图:
2:首先定义一个MyQueue类,再定义一个内部类ListNode,思路与无头双向链表基本一致。
3:offer方法:入队列
4:poll方法:出队列
5:pop方法:获取队头元素
6:size方法:获取队列中有效元素个数
7:isEmpty方法:判断队列是否为空
8: MyCircularQueue:环形队列
其本质是利用数组的思想来解决问题,类似于一个环形数组。
示意图:
入队列和出队列:
获取队头元素和队尾元素:
第2个方法要专门分析,如果rear为0,则下标index等于数组的长度减1,也就是下标为7的位置;
如果rear不为0,则下标就为rear-1
判断是否为空和为满:
在Test类main方法中调用:
输出结果:
9:用队列实现栈
示意图:
push方法:qu1不为空,x放入qu1;qu2不为空,x放入qu2;都为空就放入qu1。
pop方法:移除并返回栈顶元素
先判断qu1和qu2是否为空,如果都为空就直接返回-1,结束程序。
如果qu1不为空,因为后面qu1.size()的大小会不断改变,所以赋给size1,成为定值。然后通过for循环遍历qu1,取出栈顶元素并赋给tmp,再把tmp放入qu2中。
注意size要减1,因为最后要return一个qu1.poll(),队列里面不能没有元素。
如果qu2不为空,通过for循环遍历qu2,取出栈顶元素并赋给tmp,再把tmp放入qu1中。
top方法:返回栈顶元素
先判断qu1和qu2是否为空,如果为空就直接返回-1结束程序。
如果qu1不为空,遍历qu1,把qu1的栈顶元素赋给tmp,再把tmp放入qu2中。
注意这里size1不用减1,因为最后直接返回tmp就可以了。
如果qu2不为空,遍历qu2,把qu2的栈顶元素赋给tmp,再把tmp放入qu1中。
在Test类main方法运行:
输出结果:
10:用栈实现队列
实例化两个栈,用来实现一个队列的功能。
示意图:
peek方法:获取栈顶元素
如果s1和s2均为空,直接返回-1结束程序。
如果s2为空,当s1不为空的时候,取出s1栈顶元素放入s2中,最后返回s2栈顶元素。
在Test类main方法中调用:
输出结果: