栈的定义(后进先出LIFO)
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
我们把允许插入和删除的一端叫做栈顶,另一端叫做栈底。不含元素的栈叫做空栈。元素插入叫入栈,删除叫出栈。
栈的顺序存储结构
栈是线性表的特例,限制了插入和删除的位置,只能在栈顶进行。栈的顺序存储其实就是线性表顺序存储的简化版,也是用数组来实现的。
顺序栈代码
public class MyStack<T> {
private static final int MAXSIZE = 10;
private T[] elementData;
private int top;
public MyStack(){
elementData = (T[])new Object[MAXSIZE];
top = 0;
}
//判栈满
public boolean isFull(){
return top == elementData.length;
}
//判栈空
public boolean isEmpty(){
return top == 0;
}
//入栈
public void push(T value){
if (isFull()){
grow();
}
elementData[top++] = value;
}
//数组扩容
private void grow() {
elementData = Arrays.copyOf(elementData,elementData.length*2);
}
//出栈
public void pop(){
if (!isEmpty()){
elementData[top] = null; //防止内存泄漏
top--;
}
}
//获取栈顶元素
public T peek(){
if (!isEmpty())
return elementData[top-1];
else
return null;
}
//获取栈的大小
public int size(){
return top;
}
//显示栈元素
public void show(){
int length = top;
while (length>0){
System.out.print(elementData[length-1]+" ");
length--;
}
System.out.println();
}
}
测试代码
public class Test {
public static void main(String[] args) {
MyStack<Integer> myStack = new MyStack<>();
myStack.push(3);
myStack.push(2);
myStack.push(1);
myStack.show();
myStack.pop();
System.out.println(myStack.size());
System.out.println(myStack.peek());
}
}