最近又看到了一本书中讲了数据结构中很简单的栈的实现,上次看到该内容时就想自己动手实现一番,无奈各种情况导致无法实现,此次看到,决定简单实现以下以加深个人理解! 本人菜鸡一枚,如有大神看到,请多指导,勿喷勿喷,哈哈!
书归正传:
首先我们编写一个代表栈的类:
/**
* @ClassName: StackDemo
* @Description: 数据结构之栈(Stack)
* @author: zhangjiaqi
* @date: 2018年6月20日 下午7:39:11
*/
public class StackDemo {
private static int[] stack = new int[10];//使用一个数组代表栈,即模仿将一块连续内存当做栈空间
private static int top = 0;//栈顶指针,随时记录栈顶的位置
private static int extension = 2; //当栈满后需要扩充空间的倍数
/**
* @Title: get
* @Description: 从栈中取数据
* @return int
* @author zhangjiaqi
* @date 2018年6月20日下午7:59:24
*/
public static int get() {
if(top > 0) {//防止下标越出,如果取到了栈底,就一直返回栈底的值
top--;
}else {
top = 0;
}
return stack[top];
}
/**
* @Title: set
* @Description: 向栈中存数据
* @param i
* @return int
* @author zhangjiaqi
* @date 2018年6月20日下午7:59:47
*/
public static int set(int i) {
if(top > (stack.length-1)) {//如果栈顶指针超出最大下标,则为栈分配更大的空间(这里设置为2倍),
//应该也有一个值作为上限,此处暂时不做处理
stack = Arrays.copyOf(stack, stack.length*extension);
stack[top] = i;
top++;
}else {
stack[top] = i;
top++;
}
//set成功,返回set的值
return i;
}
}
然后就可以编写一个main来测试一下:
public static void main(String[] args) {
//简单粗暴,哈哈哈哈
System.out.println("0次get:"+StackDemo.get());
System.out.println("0次set:"+StackDemo.set(100));
System.out.println("1次set:"+StackDemo.set(200));
System.out.println("2次set:"+StackDemo.set(300));
System.out.println("3次set:"+StackDemo.set(400));
System.out.println("4次set:"+StackDemo.set(500));
System.out.println("5次set:"+StackDemo.set(600));
System.out.println("6次set:"+StackDemo.set(700));
System.out.println("7次set:"+StackDemo.set(800));
System.out.println("8次set:"+StackDemo.set(900));
System.out.println("9次set:"+StackDemo.set(1000));
System.out.println("10次set:"+StackDemo.set(1100));
System.out.println("1次get:"+StackDemo.get());
System.out.println("2次get:"+StackDemo.get());
System.out.println("3次get:"+StackDemo.get());
System.out.println("4次get:"+StackDemo.get());
System.out.println("5次get:"+StackDemo.get());
System.out.println("6次get:"+StackDemo.get());
System.out.println("7次get:"+StackDemo.get());
System.out.println("8次get:"+StackDemo.get());
System.out.println("9次get:"+StackDemo.get());
System.out.println("10次get:"+StackDemo.get());
System.out.println("11次get:"+StackDemo.get());
System.out.println("12次get:"+StackDemo.get());
}
控制台打印结果:
0次get:0
0次set:100
1次set:200
2次set:300
3次set:400
4次set:500
5次set:600
6次set:700
7次set:800
8次set:900
9次set:1000
10次set:1100
1次get:1100
2次get:1000
3次get:900
4次get:800
5次get:700
6次get:600
7次get:500
8次get:400
9次get:300
10次get:200
11次get:100
12次get:100
总结:
其实,这段代码简单的代码也让我写了将近半个小时的时间,很值得! 只有自己动手后才会有一种明显得映像,不显得那么得模糊不清,虽然简单,但是也是很有收获的!