栈 
 :一种特殊的线性表,其 
 只允许在固定的一端进行插入和删除元素操作 
 。 
 
 
 
 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO 
 ( 
 Last In First Out 
 )的原则。  
 
 
 
 压栈:栈的插入操作叫做进栈/ 
 压栈 
 / 
 入栈, 
 入数据在栈顶 
 。  
 
 
 
 出栈:栈的删除操作叫做出栈。 
 出数据在栈顶 
 。 
 
 
 
 
 
 
 
  栈的使用  
 
 
  
 | 方法 | 功能 | 
| Stack() | 构造一个空的栈 | 
| E push(E e) | 将e入栈,并返回e | 
| E pop() | 将栈顶元素出栈并返回 | 
| E peek() | 获取栈顶元素 | 
| int size() | 获取栈中有效元素个数 | 
| boolean empty() | 检测栈是否为空 | 
public static void main(String[] args) {
    Stack<Integer> s = new Stack();
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    System.out.println(s.size()); // 获取栈中有效元素个数---> 4
    System.out.println(s.peek()); // 获取栈顶元素---> 4
    s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3
    System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3
    if(s.empty()){
        System.out.println("栈空");
    }else{
        System.out.println(s.size());
    }
} 
   栈的模拟实现  
  
 
   
   
 
   
    从上图中可以看到, 
    Stack 
    继承了 
    Vector 
    , 
    Vector 
    和 
    ArrayList 
    类似,都是动态的顺序表,不同的是 
    Vector 
    是线程安全的。  
   
 
    
   public class MyStack {
    int[] array;
    int size;
    public MyStack(){
        array = new int[3];
    }
    public int push(int e){
        ensureCapacity();
        array[size++] = e;
        return e;
    }
    public int pop(){
        int e = peek();
        size--;
        return e;
    }
    public int peek(){
        if(empty()){
            throw new RuntimeException("栈为空,无法获取栈顶元素");
        }
        return array[size-1];
    }
    public int size(){
        return size;
    }
    public boolean empty(){
        return 0 == size;
    }
    private void ensureCapacity(){
        if(size == array.length){
            array = Arrays.copyOf(array, size*2);
         }
     }
} 
     概念区分 
    
 
     
      栈、虚拟机栈、栈帧有什么区别呢? 
     
 
      
     
       栈是一种数据结构,用于存储和管理数据。虚拟机栈是Java虚拟机中的一部分,用于执行Java方法。栈帧是虚拟机栈中的一个元素,用于存储方法的局部变量、操作数栈、动态链接和方法返回值等信息。 
     
 
    


















