栈 ——基础入门
目录
## 概念简述:
一种只能从一端添加/取出元素的线性结构,相比于数组操作较少,对应的操作是数组的子集,可以简单理解
为就是一个操作受限并且元素排列存放的数组
## 特点:
1. 只能从一端进行操作(栈顶),即只能从一端添加元素(入栈)或取出元素(出栈)
2. 对于用户而言,栈内元素不可见更不允许操作,只能够看到/操作栈顶元素
3. 存储元素后进先出(LIFO:last in first out)
## 应用举例:
1.撤销/回退操作
2.系统栈
## 原理实现:(java
1. 准备接口
// 准备接口
public interface Stack<E>{
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}
2. 准备实现类
// 准备实现类
public class ArrayStack<E> implements Stack<E>{
Array<E> array; // 自定义动态数组
// 构造方法
public ArrayStack(){
array = new Array<>()
}
public ArrayStack(int capacity){ // 容积
array = new Array<>(capacity);
}
@Override
public int getSize(){
return array.getSize();
}
@Override
public boolean isEmpty(){
return array.isEmpty();
}
@Override
public void push(E e){
array.addLast(e);
}
@Override
public E pop(){
return array.removeLast();
}
@Override
public E peek(){
return array.getLast();
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("Stack:");
res.append("[");
for(int i = 0, i < array.getSize(); i++){
res.append(array.get(i));
if (i != array.getSize() -1) {
res.append(", ");
}
}
res.append("] top");
return res.toString();
}
public int getCapacity(){
return array,getCapacity();
}
}
3. 准备测试类
// 准备测试类
public static void main(String args[]){
ArrayStack<Integer> stack = new ArrayStack<>();
for (int i = 0; i < 5; i++) {
stack.push(i);
System.out.println(stack);
}
stack.pop();
System.out.println(stack);
}
## 时间复杂度分析:(针对于上方自定义栈
void push(E) O(1) //均摊
E pop() O(1) //均摊
E peek() O(1)
int getSize() O(1)
boolean isEmpty O(1)
[注意]:
由于对于栈的基础入栈出栈操作时间复杂度为O(1),当涉及到resize方法即发生扩容时,经过均摊复杂度
分析依然为O(1)
资料来源:慕课网《玩转数据结构》