目录
什么是栈
我们来看一下百度百科中对栈的定义:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的实现
栈和数组,链表一样,也是一种线性的数据结构。在有些编程语言中并没有栈这种数据结构,但是要实现一个栈却也简单,通过数组或者链表都可以来实现一个栈。
通过数组实现
在 Java
中,栈(Stack 类)就是通过数组来实现的,下面我们就自己利用数组来实现一个简单的栈:
package com.lonely.wolf.note.stack; import java.util.Arrays; /** * 基于数组来实现自定义栈 */ public class MyStackByArray<E> { public static void main(String[] args) { MyStackByArray stack = new MyStackByArray(); stack.push(1); System.out.println("stack有效元素个数:" + stack.size);//输出 1 System.out.println("查看栈顶元素:" + stack.peek());//输出 1 System.out.println("栈是否为空:" + stack.isEmpty());//输出 false System.out.println("弹出栈顶元素:" + stack.pop());// 输出 1 System.out.println("栈是否为空:" + stack.isEmpty());//输出 true stack.push(2); stack.push(3); stack.push(4); System.out.println("stack有效元素个数:" + stack.size);//输出 3 System.out.println("弹出栈顶元素:" + stack.pop()); //输出 4 } private Object[] element;//存储元素的数组 private int size;//栈内有效元素 private int DEFAULT_SIZE = 2;//默认数组大小 public MyStackByArray() { element = new Object[DEFAULT_SIZE]; } /** * 判断是否为空,注意不能直接用数组的长度 * @return */ public boolean isEmpty(){ return size == 0; } /** * 查看栈顶元素 * @return */ public synchronized E peek() { if (size == 0){ return null; } return (E)element[size-1]; } /** * 查看并弹出栈顶元素 * @return */ public E pop() { if (size == 0){ return null; } E obj = peek(); size--;//利用 size 属性省略元素的移除 return obj; } /** * 压栈 * @param item * @return */ public E push(E item) { ensureCapacityAndGrow(); element[size++] = item; return item; } /** * 扩容 */ private void ensureCapacityAndGrow() { int len = element.length; if (size + 1 > len){//扩容 element = Arrays.copyOf(element,len * 2); } } }
通过队列实现
除了通过数组,其实通过链表等其他数据结构也能实现,实现栈最关键就是要注意栈的 后进先出 特性。
在 leetcode
中的第 225
是利用两个队列来实现一个栈,具体要求是这样的:
请你仅使⽤两个队列实现⼀个后⼊先出(LIFO)的栈,并⽀持普