1. 概念
栈(Stack)是一种数据结构,是一种特殊的线性表,它是按照后进先出(Last-In-First-Out, LIFO)原则工作的线性数据结构。栈中的插入和删除元素的操作只能在栈顶进行,因此栈也被称为“后进先出表”。栈可以用数组或链表实现。
栈最基本的操作是:入栈(Push)、出栈(Pop)和获取栈顶元素(Top)。其中,入栈操作将元素放到栈顶,出栈操作将栈顶元素移除并返回其值,获取栈顶元素则是获取栈顶元素的值但是不移除栈顶元素。
另外,栈还有一些其他的常用操作,如:判断栈是否为空(IsEmpty)、获取栈中元素的个数(Size)、清空栈中的所有元素(Clear)等。
2. 常用的栈的方法
2.1 方法
方法 |
功能 |
push() | 在栈顶插入元素 |
pop() | 删除栈顶元素,并返回该元素的值。如果栈为空,则抛出EmptyStackException异常 |
peek() | 返回该元素的值。如果栈为空,则抛出EmptyStackException异常 |
empty() | 如果栈为空返回true,或者返回false |
size() | 返回栈内元素个数 |
2.2 代码
public static void main(String[] args) { Stack<Character> stack = new Stack<>(); //插入A B C stack.push('A'); stack.push('B'); stack.push('C'); System.out.println(stack.size());//获得栈中元素个数,打印 3 System.out.println(stack.pop());//删除并获得栈顶元素 C System.out.println(stack.pop());//删除并获得栈顶元素 B stack.push('D');//栈顶插入D System.out.println(stack.empty()); }
注意:
- 方法push(),pop(),peek()都是在栈顶执行插入,删除以及检索操作。isEmpty()和size()是标准的集合方法。
- 栈顶操作的pop(),peek()的执行条件是栈不为空。
3. 自己实现栈
3.1 构造MyStack
Stack是动态顺序表,可以使用数组来实现,则我们需要创建一个数组,还可以用一个创建一个变量记录栈内元素大小。
public class MyStack { public int[] elem; public int size = 0; public MyStack(){ elem = new int[10]; } //... }
3.2 push()
先进行判断栈的容量大小是否足够,不够进行栈的扩容,在进行压栈,反之,直接压栈,并将记录栈的大小的size加1;
//入栈、压栈 public void push(int val){ if(size == elem.length){ ensureCapacity(); } elem[size] = val; size++; }
3.3 ensureCapacity()
栈中的元素个数不小于容量时,要对容量进行扩容,就是将栈中的元素克隆到更大的数组中。
private void ensureCapacity() { elem = Arrays.copyOf(elem,2 * elem.length); }
3.4 pop()
出栈的时候要进行判断栈是否为空,如果栈为空,抛出EmptyStackException异常,反之,将栈顶元素删除并抛出,记录栈元素大小的size 减1;
public int pop(){ if(size == 0 ){ throw new EmptyStackException(); } return elem[--size]; }
3.5 peek()
只需要把栈顶元素返回,要进行判断栈是否为空,如果栈为空,抛出EmptyStackException异常。
//获得栈顶 public int peek(){ if(size == 0){ throw new EmptyStackException(); } int key = size - 1; return elem[key]; }
3.6 empty()
判断size大小,szie = 0; 则返回true,反之false;
1. //检查栈是否为空 2. public boolean empty(){ 3. return size == 0; 4. }
3.7 szie()
直接返回size大小;
1. //栈内元素的个数 2. public int size(){ 3. return size; 4. }
4. 栈的应用
- 改变元素的序列
- 将递归转化为循环
- 括号匹配
- 逆波兰表达式求值
- 最小栈
这些都是较重要的应用,篇幅较大,我就放在了下篇博客,喜欢的可以点我主页查看。