栈的特性:后进先出,或者先进后出
栈中原有数据
栈底{1,2,3,4,5,6,7}栈顶
新入栈元素 8
stack.push(8);
入栈后
栈底{1,2,3,4,5,6,7,8}栈顶
只要栈非空,就一直进行出栈操作
while(!stack.isEmpty()) {
Integer pop = stack.pop();
System.out.println(pop);
}
出栈结果
8
7
6
5
4
3
2
1
源码:入栈,出栈,栈状态判断,栈扩容操作
package datastructure;
import java.util.Arrays;
/**
* 演示数据结构---栈的操作
* @Author gzx @create 2022-1-27
*/
public class StackDemo {
public static void main(String[] args) {
Integer[] data= {1,2,3,4,5,6,7};
Stack<Integer> stack = new Stack<>();
stack.setData(data);
stack.push(8);
while(!stack.isEmpty()) {
Integer pop = stack.pop();
System.out.println(pop);
}
}
}
/**
* 该类的一个实例表示一块栈内存区域,提供了入栈,出栈,栈状态判断,栈扩容操作
*@param <V> 栈中元素的类型
*@Author gzx @create 2022-1-27
*/
class Stack<V>{
/*数据*/
private V[] data;
/*栈顶指针*/
private int top=0;
public void setData(V[] data) {
this.data = data;
top=data.length-1;
}
public Stack() {
}
public Stack(V[] data) {
this.data = data;
top=data.length-1;
}
public V pop(){
//空栈:栈中的数据已经全部出栈
if (top<0) {
throw new IllegalArgumentException("stack is empty now "+top);
}
return data[top--];
}
public void push(V element) {
//压栈到达栈顶时扩容
if (top==(data.length-1))
capcityExpand();
data[++top]=element;
}
public boolean isEmpty() {
//栈空时,top=-1;非空时,top>=0
return top<0;
}
/**
*容量较小时,扩容快,避免频繁扩容
*容量较大时,扩容速度变慢,避免空间浪费
*(申请了很多内存,但这些内存空间并未存放元素)
*/
private void capcityExpand() {
if (top<64) {
data = Arrays.copyOf(data,data.length*2);
}else {
data = Arrays.copyOf(data, (int)(data.length*1.2));
}
}
}