栈——数组实现
栈是逻辑结构,想象出来不存在但可以用物理结构来实现的一种数据结构。看不见摸不着,抽象概念。
利用数组实现
首先了解栈,栈是一个先进先出的线性结构,只有进栈和出栈两种操作,且只能从栈顶进栈和出栈,通过描述使用数组可以把下标为0的作为栈底,每次进栈数组加入后面的下标位置,且用临时变量head获取栈顶,出栈则把head返回,数组大小减1达到效果。
public class MyStack {
private int[] arr;
private int size;//栈的元素长度
private int head;//栈头
public MyStack(){
}
//初始化栈
public MyStack(int n){
this.arr = new int[n];
this.size = 0;
this.head = 0;
}
/**
* 进栈操作 增
* @param elem 进栈的元素
*/
public void push(int elem){
//如果大于就扩容 比如初始化5 size也是5 这时候就要考虑扩容
if(size>=arr.length){
reSize();
}
//将传进来的元素存入数组
arr[size]=elem;
this.head = elem;
size++;
}
//扩容操作
private void reSize() {
int[] newArr = new int[arr.length*2];
//不记得怎么用去回顾数据结构——数组
System.arraycopy(arr,0,newArr,0,arr.length);
arr = newArr;//至此扩容成功
}
/**
* 出栈操作
* @return 栈顶
*/
public int pop(){
size--;
return head;
}
/**
* 输出栈元素
*/
public void print(){
if(size<=0){
//说明没有元素则不能出栈
System.out.println("栈里面元素为空");
}else {
StringBuffer sb = new StringBuffer();
sb.append("栈头:");
for (int i = size - 1; i >= 0; i--) {
sb.append(arr[i] + " ");
}
String s = sb.toString();
System.out.println(s);
}
}
}
测试类:
public static void main(String[] args) {
MyStack ms = new MyStack(3);
ms.print();//栈里面元素为空
ms.push(3);//3
ms.push(2);//2 3
ms.push(1);//1 2 3
ms.print();//栈头:1 2 3
int pop = ms.pop();
System.out.println("出栈的元素为:"+pop);//出栈的元素为:1
ms.print();//栈头:2 3
ms.push(4);
ms.print();//栈头:4 2 3
ms.push(5);
ms.pop();// 剩下4 2 3
ms.pop();// 剩下 2 3
ms.pop();// 剩下3
ms.pop();// 剩下
ms.print();//栈里面元素为空
}