1.栈有两种写法,一种是以数组为躯干的顺序栈,一种是以链表为躯干的链式栈。
1.1栈的操作
1.1.1 出栈pop()函数
允许栈出,栈出之后,顶数据有移除操作。
时间复杂度o(1)
1.1.2 入栈push()函数
入栈,入栈之后,前一个数据网后呀。
时间复杂度o(1)
1.1.3 顶数据获取:peek()函数
不会做数据的移除。
时间复杂度o(1)
1.1.4 判空函数len()
当用于遍历的时候,需要知道判空的终止节点。
1.1.5 元素获取:search(int index)
获取节点的某个元素。
时间复杂度o(1);
2.我们来实现一个顺序栈
我们已经知道了上述方法,还是得建立一个继承体系。
先写一个接口叫IStack
public interface IStack<T> {
void push(T t);
T pop();
T peek();
T search(int index);
int len();
}
然后实现这个接口
package com.stack.order;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
public class OrderLinkStack<T> implements IStack<T>{
public OrderLinkStack(int index){
tArray = (T[])new Object[index];
}
T[] tArray;
int pointer = 0;
@Override
public void push(T t) {
tArray[pointer] = t;
pointer++;
}
@Override
public T pop() {
return tArray[--pointer];
}
@Override
public T peek() {
return tArray[pointer - 1];
}
@Override
public T search(int index) {
return tArray[index];
}
@Override
public int len() {
return pointer;
}
}
我们写一个Int类型的栈
public class IntOrderLinkStack extends OrderLinkStack<Integer> {
public IntOrderLinkStack(int index) {
super(index);
}
}
然后测试这个栈
测试结果
3.数组栈的问题
不能自动扩容,有个容量峰值。这点不太好。当然,这也是种访问机制。search的时候,时间复杂度为o(1)这一点就相当爽了。