虽然栈操作看起来比数组要简单的多,但对于计算机逻辑来说是非常重要的
我们在执行程序的的时候,可能会如下列伪代码一样在方法1里调用方法2,在方法2里调用方法3,执行完毕后一层一层的返回,这就是借助程序调用的系统栈来实现的
public void function1(){
System.out.println(function2());
}
public Integer function2(){
return function3();
}
public Integer function3(){
return 233;
}
在1要执行2的时候将1的状态压入程序调用的系统栈,在2执行3的时候将2的状态压入程序调用的系统栈。当3执行完的时候将2的状态出栈,并获取到3的执行结果,然后继续执行2。当2执行完毕后将1的状态出栈,并获取到2的执行结果,然后继续执行1。
用https://blog.csdn.net/test253506088/article/details/119538593编写的动态数组实现栈
/**
* 栈需要实现的一些接口
*/
public interface Stack<E> {
/**
* 入栈
*
* @param e
*/
public void push(E e);
/**
* 出栈,如果没有可出栈的返回null
*
* @return
*/
public E pop();
/**
* 查看栈顶的值是什么,没有则返回null
*
* @return
*/
public E peek();
/**
* 获取栈的大小
*
* @return
*/
public Integer getSize();
/**
* 是否为空,空返回true
*
* @return
*/
public Boolean isEmpty();
}
具体实现
/**
* 用数组的形式实现栈
*
* @param <E>
*/
public class ArrayStack<E> implements Stack<E> {
private Array<E> array;//用的是002号文档里实现的动态数组
/**
* 创建时指定栈的容量
*
* @param capacity
*/
public ArrayStack(Integer capacity) {
array = new Array<>(capacity);
}
/**
* 未指定栈的容量默认为20
*/
public ArrayStack() {
this(20);
}
@Override
public void push(E e) {
try {
array.putFirst(e);
} catch (Exception e1) {
e1.printStackTrace();
}
}
@Override
public E pop() {
E buffer = null;
try {
buffer = array.getLast();
array.deleteLast();
} catch (Exception e) {
e.printStackTrace();
} finally {
return buffer;
}
}
@Override
public E peek() {
E buffer = null;
try {
buffer = array.getLast();
} catch (Exception e) {
e.printStackTrace();
} finally {
return buffer;
}
}
@Override
public Integer getSize() {
return array.getSize();
}
@Override
public Boolean isEmpty() {
return array.isEmpty();
}
@Override
public String toString() {
String buffer = "";
Integer size = array.getSize();
try {
for (Integer i = 0; i < size; i++) {
buffer += array.get(i).toString();
if (i != size - 1)
buffer += ", ";
}
} catch (Exception e) {
e.printStackTrace();
}
// 最右边的值是栈顶
return "Size:" + size + "\tArrayStack[" + buffer + "]";
}
}