-
栈结构特点是在栈顶位置进行元素的增加(入栈)和删除(出栈),栈的底层结构使用的也是数组
/**
* 栈的代码实现,应用:波兰中序表达式转后序表达式,并求出表达式的值
*
* @author timmy1 栈的元素操作只在一端(栈顶位置),进行插入和删除-》包含的操作有:元素插入到栈顶push, 删除栈顶元素pop,
* 获取栈顶元素peek,搜索元素的位置
*/
public class MyStack<E> {
private int size;
private int modSize;
private Object[] array;// 栈的底层结构为数组
private int DEFAULT_CAPACITY = 10;
public MyStack() {
array = new Object[DEFAULT_CAPACITY];
}
/**
* 入栈-- 栈顶位置插入元素,即是数组最后的位置
*
* @param e
* @return
*/
public boolean push(E e) {
array = judgeIsGrow();
array[size] = e;
size++;
modSize++;
return true;
}
// 判断数组长度是否需要扩容
private Object[] judgeIsGrow() {
if (array.length == size) {
int newSize = size < Integer.MAX_VALUE / 2 ? size * 2 : Integer.MAX_VALUE;
Object[] newArray = new Object[newSize];
System.arraycopy(array, 0, newArray, 0, size);
array = newArray;
}
return array;
}
/**
* 出栈-- 删除栈顶元素
*
* @return
*/
public boolean pop() {
if (size == 0) {
throw new IndexOutOfBoundsException("当前栈元素为空");
}
array[size - 1] = null;
size--;
modSize++;
return true;
}
/**
* 获取栈顶元素
*
* @return
*/
@SuppressWarnings("unchecked")
public E peek() {
if (size == 0)
return null;
E obj = (E) array[size - 1];
modSize++;
return obj;
}
/**
* 搜索元素e的位置
*
* @param e
* @return
*/
public int search(E e) {
if (e == null) {
for (int i = size - 1; i >= 0; i--) {
if (array[i] == null) {
return size - 1 - i;
}
}
} else {
for (int i = size - 1; i >= 0; i--) {
if (array[i].equals(e)) {
return size - 1 - i;
}
}
}
return -1;
}
public int size() {
return size;
}
public static void main(String[] args) {
MyStack<String> myStack = new MyStack<>();
for (int i = 0; i < 5; i++) {
myStack.push("data " + i);
}
System.out.println("搜索 " + myStack.search("data 4"));
int size = myStack.size();
for (int i = 0; i < size; i++) {
String data = myStack.peek();
System.out.println(data);
myStack.pop();
}
}
}
结果打印:
搜索 0
data 4
data 3
data 2
data 1
data 0