文章目录
前言
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)
一、栈Stack是什么?
1、栈也是一种线性数据结构
规定:只能从栈顶添加元素,也只能从栈顶取出元素
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。
二、栈的具体实现
栈的具体实现
定义栈:
Stack<E>
入栈 push:
void push(T ele);
弹栈 pop (出栈):
T pop();
查看栈顶元素 peek:
T peek();
获取栈中实际存放元素的个数:
int getSize();
判断栈是否为空:
boolean isEmpty();
定义栈的接口:
public interface MyStack<T> {
//入栈 push
void push(T ele);
//弹栈 pop (出栈)
T pop();
//查看栈顶元素 peek
T peek();
//获取栈中实际存放元素的个数
int getSize();
//判断栈是否为空
boolean isEmpty();
}
以数组作为栈的底层数据结构,来存放栈中的元素
public class ArrayStack<T> implements MyStack<T>{
//数据容器
private MyselfArrays<T> data;
//栈中实际存放的元素
private int size;
ArrayStack(){
this.data = new MyselfArrays();
this.size = 0;
}
@Override
public void push(T ele) {
this.data.addTail(ele);
this.size++;
}
@Override
public T pop() {
T result = this.data.removeLast();
if(result != null) {
this.size--;
}
return result;
}
@Override
public T peek() {
if(this.isEmpty()) {
return null;
}
return this.data.getEleByIndex(this.size - 1);
}
@Override
public int getSize() {
return this.size;
}
@Override
public boolean isEmpty() {
return this.size == 0;
}
//测试
public static void main(String[] args) {
MyStack<Integer> arrayStack = new ArrayStack<>();
int cout = 20;
Random random = new Random();
for (int i = 0; i < cout; i++) {
int num = random.nextInt(100);
if(i > 0 &&i % 3 == 0){
System.out.println("出栈元素:"+arrayStack.pop());
}
System.out.print(num+",");
arrayStack.push(num);
}
System.out.println("\n-------------------");
while(!arrayStack.isEmpty()){
System.out.println(arrayStack.pop());
}
}
}
三、栈的时间复杂度分析
ArrayStack<E>
- void push() 0(1) 均摊
- E pop() 0(1) 均摊
- E peek() 0(1)
- int getSize() 0(1)
- boolean isEmpty() 0(1)