系列文章目录
01 Java基本数据结构之栈实现
02 Java基本数据结构之队列实现
03 Java基本数据结构之优先级队列
04 Java基本数据结构之链表
如有错误,还请指出
文章目录
前言
笔者在学习了数据结构后,希望通过Java实现加深印象,如栈、队列、链表等基本结构,可网上这方面资料比较少或者带有各种个人风格不太规范的代码,零零碎碎的,对于我这个初学者而言不太友好,有些地方不是很理解,因此阅读了《Java数据结构和算法》,学习里面的基本数据结构的Java实现,并参考里面代码写下博客记录自己的学习过程。同时文章主要专注于数据结构代码的实现和理解,对于数据结构原理部分不会很详细,希望能对有同样困惑的朋友有个小小的参考。
同时对于代码部分提前做个说明,对于基本结构的Java实现书中并没有作泛型来参数化类型,但在后面链表的一个实现中,笔者使用了泛型举例,其他的实现为了方便理解都是使用了特定的数据类型的,当然这都只是一些小问题。同时强烈建议在看了整体的代码实现后,自己手敲一遍代码,这样基本结构的Java实现会在通过几次练习后逐渐掌握。
一、栈(简述)
栈只允许访问一个数据项:即最后插入的数据项。移除这个数据项后才能访问倒数第二个插入的数据项,以此类推。大部分的微处理器运用基于栈的体系结构,当待用一个方法时,把它的返回地址和参数压入栈,当方法结束返回时那些数据出栈,栈操作就嵌入在微处理器中。
为了理解栈的思想,以书中美国邮政服务为例,邮政局收到信时,会投入到一个专门的筐里,待有空闲时间的时候,从上到下处理这写堆叠的信件。当然,许多人不会生硬的遵循这种从上到下的顺序,比如,可能先拿栈底的信件;或者可以在处理信件前,改变信件的顺序马,紧急的放在最上面优先处理。如果从栈底拿信,那就是队列的结构;如果区分优先次序,那就是优先级队列,在后面的文章里都会详细叙述。
二、栈-数组实现
本次
栈
实现是使用数组
实现的,在后面的部分,如理解了链表后,可以使用链表实现。数组实现是一种很简单同时很好理解的方式。
/*
* 01 数组实现的栈
* push 、remove、 peek 入栈、出栈、查看栈顶值
* isFull isEmpty size 判断栈满、空、大小
* */
public class StackX {
private int maxSize;
private int top; // 栈顶指针
private long[] stackArray;
public StackX(int maxSize) {
this.maxSize = maxSize;
this.top = -1;
this.stackArray = new long[maxSize];
}
public void push(long item) throws Exception {
if (isFull()) throw new Exception("栈满");
stackArray[++top]=item;
}
public long remove() throws Exception {
if (isEmpty()) throw new Exception("栈空");
return stackArray[top--];
}
public long peek(){
return stackArray[top];
}
public boolean isFull(){
return top+1==maxSize;
}
public boolean isEmpty(){
return top==-1;
}
public int size(){
return top+1;
}
@Override
public String toString() {
return "StackX{" +
"maxSize=" + maxSize +
", top=" + top +
", stackArray=" + Arrays.toString(stackArray) +
'}';
}
}
三、注意点
3.1构造方法
构造器根据参数规定的容量大小创建一个新栈,变量 top 相当于一个指针,存储栈顶元素的下标。(此时的栈是由数组实现的,因此需要定义栈的大小,如果使用链表实现,则不用实现规定。)
3.2 push() 入栈
push() 方法使 top值增加,指向栈更上面的位置,然后存储一个数据,注意 top 值是在插入数据前递增的,代码里 区分 ++i 加了再用 , i++用了再加。
3.3 remove() 出栈
返回 top 指向的数据,然后top减一。
3.4 peek() 查看栈顶元素
仅仅返回 top指向的栈顶元素,不对栈作任何改动
3.5 ifFull() isEmpty() 判断空、满
空、满判断在数据结构里是非常重要的,不管是此处栈还是后面其他结构的实现,它对增删的处理都有着巨大的影响。
测试
public class StackTest {
public static void main(String[] args) throws Exception {
StackX stack=new StackX(5);
stack.push(50);
stack.push(20);
stack.push(30);
System.out.println("stack.peek():"+stack.peek());
stack.push(40);
stack.push(10);
System.out.println(stack);
int j=stack.size();
for (int i = 0; i < j; i++) {
System.out.println(stack.remove());
}
}
}
/*
stack.peek():30
StackX{maxSize=5, top=4, stackArray=[50, 20, 30, 40, 10]}
10
40
30
20
50
*/