栈的定义
栈(stack)又名堆栈,是一种线性表。仅可在栈顶(线性表的表尾)进行插入和删除的操作,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的操作
1.进栈:push()
2.出栈:pop()
3.获取栈顶元素:peek()
4.判断栈是否为空:isEmpty()
5.遍历栈内元素:printStack()
接下来我们利用java中的数组,实现上述栈的5个小功能
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
/**
* @author cm
* @since 2019/12/2 11:16
*/
@Slf4j
public class Stack {
private Object[] elementData;
/**
* 记录元素个数
*/
private int elementCount = 0;
/**
* 栈的初始化大小
*/
private int stackSize = 1;
/**
* 无参构造函数
*/
private Stack(){
this.elementData = new Object[this.stackSize];
}
/**
* 带参数的构造函数
*/
private Stack(int stackSize){
if (stackSize > this.stackSize)
this.stackSize = stackSize;
this.elementData = new Object[this.stackSize];
}
/**
* 入栈
*/
private void push(Object item) {
pretreatmentArray(elementCount + 1);
elementData[elementCount] = item;
elementCount++;
}
/**
* 入栈前的预处理
*/
private void pretreatmentArray(int minCapacity) {
if (minCapacity > elementData.length) {
// 元素个数大于栈的容量,则需要对栈进行扩容
elementData = Arrays.copyOf(elementData, minCapacity);
}
}
/**
* 出栈
*/
private Object pop(){
if (isEmpty()) {
log.info(">>>>>>>>>Stack is empty!");
return null;
}
Object item = peek();
elementData = Arrays.copyOf(elementData, elementCount - 1);
elementCount--;
return item;
}
/**
* 获取栈顶元素
*/
private Object peek(){
if (isEmpty()) {
return null;
}
return elementData[elementData.length - 1];
}
/**
* 判断栈是否为空
* @return
*/
private boolean isEmpty(){
return elementCount == 0;
}
/**
* 遍历输出栈内元素
*/
private void printStack(){
for (int i = 0; i < elementCount; i++) {
log.info("element:{}", elementData[i]);
}
}
public static void main(String[] args) {
Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.printStack();
System.out.println("The top element on stack:"+stack.peek());
System.out.println("Stack pop element:"+stack.pop());
stack.printStack();
}
}
第一次写,难免有不足之处,欢迎各位一起探讨。