目录
栈的引入
undo操作,
浏览器页面回退到上一层,
或者大家平时用的ctrl+z都是栈顶元素出栈操作,恢复上一个状态
概念
栈是一个线性表,底层既可以用数组,也可以用链表
基于数组实现的栈——顺序栈(数组尾部的添加和删除时间复杂度为O(1))
基于链表实现的栈——链式栈(尾插和尾删)
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
/**
* 基于数组实现的顺序栈
* @param <E>
*/
public class MyStack <E>{
private int size;
// 实际存储数据的动态数组 ——ArrayList
private List<E> data = new ArrayList<>();
/**
* 将val入栈
* @param val
*/
public void push(E val){
data.add(val);
size++;
}
/**
* 删除栈顶元素
* @return
*/
public E pop(){
if(isEmpty()){
throw new NoSuchElementException("Stack is empty!cannot pop!");
}
// 栈不为空,可以弹出栈顶元素
E val= data.remove(size - 1);
size--;
return val;
}
public boolean isEmpty(){
return size == 0;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(data.get(i));
if(i != size - 1){
sb.append(", ");
}
}
sb.append("] top");
return sb.toString();
}
}
public class StackTest {
public static void main(String[] args) {
MyStack<Integer> mystack = new MyStack<>();
mystack.push(1);
mystack.push(3);
mystack.push(5);
System.out.println(mystack);
}
}
运行结果: