赞
踩
栈是一种特殊的线性表,其只允许在指定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵循后进先出(LIFO)的原则
1、压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈,出数据在栈顶
2、栈的使用
以下代码为演示
- import java.util.Stack;
- //stack的演示示例
- public class Demo1 {
- public static void main(String[] args) {
- Stack<Integer> stack = new Stack<>();
- stack.push(1);
- stack.push(2);
- stack.push(3);
- stack.push(4);
- stack.push(5);
- stack.push(6);
-
- //查看栈顶元素
- int top = stack.peek();
- System.out.println(stack);
- System.out.println("查看栈顶元素");
- System.out.println(top);
-
- //弹出栈顶元素
- Integer pop = stack.pop();
- System.out.println("弹出栈顶元素");
- System.out.println(pop);
- //输出元素个数
- System.out.println(stack.size());
-
- while(stack.isEmpty() == false){
- stack.pop();
- }
- System.out.println(stack);
- System.out.println(stack.size());
- }
- }
注:栈为空的时候,去pop或peek都会抛出异常
2、栈的模拟实现
由图可知,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的
- import java.util.Arrays;
-
- public class Mystack {
- private int[] elementData;
- private int size;
- private final int DEFAULT_CAPACITY = 5;
-
- public Mystack() {
- this.elementData = new int[DEFAULT_CAPACITY];
- }
-
- public Mystack(int capacity) {
- if (capacity < 0) {
- throw new RuntimeException("数组容量不能小于0");
- }
- this.elementData = new int[capacity];
- }
-
- public void push(int data) {
- ensureCapacity();
- elementData[size] = data;
- size++;
- }
-
- public void ensureCapacity() {
- if (size == elementData.length) {
- this.elementData = Arrays.copyOf(elementData, elementData.length * 2);
- }
- }
-
- public int pop() {
- int top = peek();
- size--;
- return top;
- }
-
- public int peek() {
- if (size == 0) {
- throw new RuntimeException("栈为空");
- }
- return elementData[size - 1];
- }
-
- public int size() {
- return size;
- }
-
- public boolean empty() {
- return size == 0;
- }
- }
注:IDEA中格式化的快捷键:ctrl + alt + L
3、栈、虚拟机栈、栈帧的区别
栈:是一种数据结构
虚拟机栈:是JVM运行时数据区的一部分,是一块内存空间,局部变量,方法的开辟都保存在这个区域
栈帧:方法开辟出来的内存被称为栈帧,细化为某一个方法的内存
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。