- - 栈的概念
1.是一种线性表,插入和删除都只在栈顶进行。
2.压栈(push):栈顶插入一个元素。
出栈(pop):删除栈顶元素。
3.遵循“后进先出”的规则。Eg:子弹入弹夹,才把子弹从弹夹中打出。
- - 栈的使用:
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(11);//压栈
stack.push(22);
stack.push(33);
stack.push(44);
Integer ret = stack.pop();//出栈 后进先出
System.out.println(ret);
int ret2 = stack.peek();//获取栈顶元素不删除 可用int表示拆包
System.out.println(ret2);
System.out.println(stack.size());//获取栈中有效元素的个数
}
- - 栈的实现
public class Mystack {
private int[] elem;//数组
private int usedSize;//记录个数
private static final int DEFAULT_SIZE = 10;
public Mystack() {
this.elem = new int[DEFAULT_SIZE];
}
public void push(int val){//入栈
if(isFull()) {
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);//扩容
}
this.elem[this.usedSize] = val;
this.usedSize++;
}
public boolean isFull(){//判满
return this.usedSize == this.elem.length;
}
public int pop() {
if(isEmpty()) {
throw new EmptyException();//抛一个空的异常
}
int oldval = this.elem[this.usedSize-1];//记录要被pop的栈顶元素
this.usedSize--;//栈顶元素被pop,个数减1
return oldval;
}
public boolean isEmpty() {//判空
return this.usedSize == 0;
}
public int peak(){
if(isEmpty()) {
throw new EmptyException();
}
return this.elem[this.usedSize-1];//
}
}
public static void main1(String[] args) {
Mystack mystack = new Mystack();
mystack.push(12);
mystack.push(23);
mystack.push(34);
mystack.push(45);
System.out.println(mystack.peak());
System.out.println(mystack.pop());
System.out.println(mystack.pop());
System.out.println(mystack.pop());
System.out.println(mystack.isEmpty());
System.out.println(mystack.pop());
System.out.println(mystack.isEmpty());
}
public class EmptyException extends RuntimeException {
public EmptyException(){
}
public EmptyException(String message) {
super(message);
}
}
- - 关系:
- - 栈的应用
1.找出不可能出栈序列
2.逆序打印链表(将递归转化为循环)
递归:
void printList(Node head) {
if(head != null) {
printList(head.next);
System.out.println(head.val+" ");
}
}
栈循环:
public void reversePrintList() {//利用栈的特性
Stack<ListNode> stack = new Stack<ListNode>();
ListNode cur = head;
while(cur != null) {
stack.push(cur);
cur = cur.next;
}
while (!stack.isEmpty()) {
ListNode top = stack.pop();
System.out.print(top.val);
}
}
- - 栈、虚拟机栈、栈帧的区别:
- - 用链表实现栈
顺序栈用Stack
链式栈用LinkedList