什么是栈
通俗来说栈就是一个操作受限的线性表
- 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则
- 压栈(push)就是数据入栈的操作,就是数据放入栈顶
- 出栈 (pop) 就是数据出栈的操作,就是将栈顶元素取出
- 可以把这种栈看作是水杯,我们最开始倒的水在最下面,只能最后喝
例子
栈的应用
- 无处不在的撤销操作,比如编译器中ctrl+z返回上一步,运用的就是栈
- 浏览器中返回上一个网页,也用的是栈
- 操作系统栈:程序在执行的时候,将不停的将函数出栈入栈,用的也是栈这个结构
栈的实现
栈的实现非常简单,但是应用很广
首先栈是一个线性表,所以可以通过数组或者是链表实现,链表实现的叫链式栈,数组实现的叫顺序栈
链表的几个重要操作
- push(E e)向栈中添加元素
- E pop()取出栈顶元素
- E peek()只查看栈顶元素,不取出
代码实现(顺序栈的实现)
package MyStack; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; /** * 基于动态数组实现的栈 */ public class MyStack<E> { private int size;//记录栈中元素个数 private List<E> Stack=new ArrayList<>(); //基于动态数组实现的栈 /** * 入栈操作 * @param e */ public void push(E e){ Stack.add(e); size++; } /** * 出栈操作 * @return */ public E pop(){ if (isEmpty()){ throw new NoSuchElementException("栈为空,不能出栈"); }else { E val=Stack.remove(size-1); size--; return val; } } public E peek(){ if (isEmpty()){ throw new NoSuchElementException("栈为空,不能查看"); }else { return Stack.get(size-1); } } public String toString(){ StringBuilder sb=new StringBuilder(); sb.append("["); for (int i = 0; i < size; i++) { sb.append(Stack.get(i)); if (i!=size-1){ sb.append(","); } } sb.append("] top"); return sb.toString(); } /** * 判断栈是否为空 * @return */ public boolean isEmpty(){ return size==0; } }