对于我们来说,栈其实是一种先进后出的格式,我们需要用数组实现栈操作的时候其实也是遵守这个原则即可.
那么如何实现先进后出的形式呢
我们可以想到什么,没错,就是通过一个外部变量来指向后面输入进来的数值.当我们需要弹出数据时,将外部变量指向的部分弹出,并置空,外部变量在添加和弹出数据时进行相应的变化.
这样我们就得到了最开始的一版代码
public class ShuzuZhan {
//栈
private String [] data;
//栈的大小
private int maxLength;
//栈的头结点
private int head;
public ShuzuZhan(int maxLength) {
if (maxLength>=0) {
this.maxLength = maxLength;
this.head = 0;
data = new String[maxLength];
}else {
throw new RuntimeException("栈初始值不能小于0");
}
}
//判断栈是否为满
public boolean isFull() {
return maxLength == head;
}
//判断栈是否为空
public boolean isEmpty() {
return head == 0;
}
//入栈
public void push(String example) {
if (isFull()) {
throw new RuntimeException("栈已满");
}else {
data[head++] = example;
}
}
//出栈
public String pop(){
if(isEmpty()){
throw new RuntimeException("空栈");
}else{
String val = data[head-1];
data[head-1] = null;
head--;
return val;
}
}
//返回栈顶元素
public String peek(){
return data[head - 1];
}
public static void main(String[] args) {
ShuzuZhan shuzuZhan = new ShuzuZhan(3);
shuzuZhan.push("1");
shuzuZhan.push("2");
shuzuZhan.push("3");
System.out.println(shuzuZhan.peek());
System.out.println(shuzuZhan.pop());
System.out.println(shuzuZhan.peek());
}
}
这时候我们就得到了一个用数组实现的栈,但是我们会发现一些问题,我们刚开始设置的栈大小是3.如果push进多个数值,就会显示栈满操作.而现实中会有栈的扩容,缩容行为.
所以在push和pop这两个方法中 我们可以加入扩容和缩容行为.
扩容可以通过栈满时,新建一个容量是原数组二倍的数组,并将原数组值置入.再让原数组指向新数组即可.同样的 缩容则可以在栈空间被利用空间小于总空间的四分之一是新建一个容量为原数组二分之一的数组,置入原数组,并让原数组指向新数组
代码如下
public class ShuzuZhan {
//栈
private String [] data;
//栈的大小
private int minLength;
//栈的头结点
private int head;
public ShuzuZhan(int minLength) {
if (minLength>=0) {
this.minLength= minLength;
this.head = 0;
data = new String[minLength];
}else {
throw new RuntimeException("栈初始值不能小于0");
}
}
//判断栈是否为满
public boolean isFull() {
return data.length== head;
}
//判断栈是否为空
public boolean isEmpty() {
return head == 0;
}
//入栈
public void push(String example) {
if (isFull()) {
String[] dataNew = new String[data.length* 2];
for(int i = 0;i < data.length;i++) {
dataNew[i] = data[i];
}
data = dataNew;
data[head++] = example;
}else {
data[head++] = example;
}
}
//出栈
public String pop(){
if(isEmpty()){
throw new RuntimeException("空栈");
}else if(head<data.length/2) {
int len = data.length/2;
if (len<minLength) {
len = minLength;
}
String[] dataNew = new String[len];
for(int i = 0;i < data.length;i++) {
dataNew[i] = data[i];
}
String val = data[head-1];
data = dataNew;
data[head-1] = null;
head--;
return val;
}else{
String val = data[head-1];
data[head-1] = null;
head--;
return val;
}
}
//返回栈顶元素
public String peek(){
return data[head - 1];
}
public static void main(String[] args) {
ShuzuZhan shuzuZhan = new ShuzuZhan(3);
shuzuZhan.push("1");
shuzuZhan.push("2");
shuzuZhan.push("3");
shuzuZhan.push("4");
System.out.println(shuzuZhan.peek());
System.out.println(shuzuZhan.pop());
System.out.println(shuzuZhan.peek());
}
}