栈
文章目录
一、栈概述
1.1 栈简介
1.1.1 定义
- 栈是一种操作受限的线性表,只允许从一端插入和删除数据
1.1.2 特性
- 栈的一个最重要的特征就是栈的插入和删除只能在栈顶进行,所以每次删除的元素都是最后进栈的元素,故栈也被称为后进先出(LIFO)表
- 在进栈只需要移动一个变量存储空间,所以它的时间复杂度为
$O(1)$
- 对于出栈分两种情况:
- 栈未满时,时间复杂度也为
$O(1)$
- 当栈满时,需要重新分配内存,并移动栈内所有数据,所以此时的时间复杂度为
$O(n)$
- 栈未满时,时间复杂度也为
1.2 分类
1.2.1 线性存储
(1)存储方式
- 顺序栈是根据顺序存储结构来写的,底层是由数组来实现的
(2)完整顺序栈包含的结构
- 存储元素的数组
- 整数top:指向栈顶的位置
- 其它辅助数据
1.2.2 链式存储
(1)存储方式
通过链表实现栈
(2)完整
- 存储栈元素链表
- 栈顶结点
- 其它辅助数据
1.3 基本操作
1.3.1 入栈 push
- 入栈也称压栈, 指的是栈的插入操作, 在栈顶位置插入新的数据元素,并将栈顶标识指向新元素
1.3.2 出栈 pop
- 出栈也称弹栈, 指的是栈的删除操作, 删除栈顶位置的数据元素,并将栈顶标识移至前一位
1.3.3 大小判断
判断栈是否为空、是否已满
二、栈的实现
2.1 栈的操作接口
2.1.1 接口java实现
package com.niss.stack;
/**
* @author Ni187
*/
public interface Stack<E> {
/**
* 判断是否是空的栈
* @return 是否是空栈
*/
boolean isEmpty();
/***
* 获得栈的元素个数
* @return 栈的元素个数
*/
int size();
/**
* 弹出栈
* @return 栈顶元素
*/
E pop();
/**
* 取出栈顶元素,但不删除
* @return 栈顶元素
*/
E peek();
/**
* 压入栈
* @param data 元素
* @return 操作是否成功
*/
boolean push(E data);
}
2.2 顺序栈实现
2.2.1 顺序栈java实现
package com.niss.stack;
/**
* @author Ni187
*/
public class ArrayStack<E> implements Stack<E>{
/**
* 初始化大小
*/
final static int INIT_SIZE =100;
/**
* 数组增长大小
*/
final static int GROWTH_SIZE = 20;
private Object[] objects;
/**
* 当前栈顶位置
*/
int size;
public ArrayStack(){
this(INIT_SIZE);
}
public ArrayStack(int size){
if(size<=0){
throw new RuntimeException("初始化大小异常");
}