栈是什么
Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。 只能在一端进行插入或者删除,即压栈与出栈。可以使用数组实现。
栈的特点:
入栈的时候,只在数组尾部插入
出栈的时候,只在数组尾部删除
栈的实现
package com;
import java.util.Arrays;
public class MyStack<E> {
//底层是数组
private Object[] elements;
//栈的个数
private int size = 0;
public MyStack() {
this(10);
}
public MyStack(int capacity) {
if(capacity <= 0){
throw new RuntimeException("初始化容量错误");
}
elements =new Object[capacity];
}
/**
* 将一个元素压入栈中
* @param e
*/
public void push(E e){
//如果栈已满,进行扩容
if(size >= elements.length){
grow();
}
elements[size++] = e;
}
/**
* 扩容
*/
private void grow() {
//将之前的数组保存
int oldCapacity = elements.length;
Object[] old = elements;
//新的数组大小为原来数组大小的2倍
int newCapacity = oldCapacity * 2;
//再新建一个大小为原来数组2倍的新数组
elements = new Object[newCapacity];
//把以前的老的数组中的元素都移动新数组中
for (int i = 0; i < oldCapacity; i++) {
elements[i] = old[i];
}
//释放以前的内存空间
old = null;
}
/**
* 出栈,就是将数组最后一个元素弹出
* @return
*/
public Object pop(){
if(isEmpty()){
return null;
}
E e = peek();
elements[--size] = null;
return e;
}
/**
* 返回最后一个元素
* @return
*/
public E peek(){
int len = size();
if(len == 0){
throw new RuntimeException("stack is empty");
}
return (E)elements[len - 1];
}
public int size(){
return size;
}
public boolean isEmpty(){
return size == 0;
}
public void print(){
System.out.print(Arrays.toString(elements)+"\n");
}
public static void main(String[] args) {
MyStack<String> myStack = new MyStack();
myStack.push("a");
myStack.push("b");
myStack.push("c");
myStack.push("d");
myStack.push("e");
myStack.print();
System.out.println(myStack.pop());
myStack.print();
System.out.println(myStack.peek());
System.out.println(myStack.pop());
myStack.print();
System.out.println(myStack.pop());
myStack.print();
myStack.push("f");
System.out.println(myStack.peek());
myStack.print();
System.out.println("栈小大:"+myStack.size());
System.out.println("栈是否为空:"+myStack.isEmpty());
}
}