目录
一、栈
1.1栈的概念
1.1.1介绍
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
编辑
编辑
1.1.2栈在现实生活中的例子
编辑
编辑
1.2栈的使用
编辑
public static void main(String[] args) { //构造一个空的栈 Stack<Integer> stack=new Stack<>(); //压栈 stack.push(10); stack.push(20); stack.push(30); //出栈 stack.pop();//10 20 System.out.println(stack.pop());//10 System.out.println(stack.peek()); System.out.println(stack.size()); //20 //10 //1 }
编辑
1.3栈的模拟实现
编辑
从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。
编辑
public class stack { private int[] array; private int usedsize; public stack(){ array=new int[5]; } //压栈 public void push(int ele){ //判断是否满,满则扩容 if(isFull()){ resize(); } array[this.usedsize]=ele; this.usedsize++; } public boolean isFull(){ if(this.usedsize==array.length){ return true; } return false; } public void resize(){ array= Arrays.copyOf(array,array.length*2); } //弹栈 public int pop(){ if(isEmpty()){ throw new StackEmptyException("栈空"); } return array[--this.usedsize]; } public int peek(){ if(isEmpty()){ throw new StackEmptyException("栈空"); } return array[this.usedsize-1]; } public int size(){ return this.usedsize; } public boolean isEmpty(){ if(this.usedsize==0){ return true; } return false; } }
1.4栈的应用场景
1.4.1改变元素的序列
1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1A:编辑
B:编辑
C: D同理可得--->答案为:C
2.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺
序是( )。
A: 12345ABCDE B: EDCBA54321 C: ABCDE12345 D: 54321EDCBA
答案:B,依次入栈依次出栈
1.4.2递归转化为循环
逆序打印链表:
编辑
void printList(Node head){ if(null != head){ printList(head.next); System.out.print(head.val + " "); } } // 循环方式 void printList(Node head){ if(null == head){ return; } Stack<Node> s = new Stack<>(); // 将链表中的结点保存在栈中 Node cur = head; while(null != cur){ s.push(cur); cur = cur.next; } // 将栈中的元素出栈 while(!s.empty()){ System.out.print(s.pop().val + " "); } }
1.5概念区分
栈、虚拟机栈、栈帧有什么区别?
栈是一种数据结构。
虚拟机栈是一块内存。
栈帧是方法调用的时候在虚拟机上开辟的内存单元。