版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32059827/article/details/62050174
1、栈。
(Android的Activity加载是基础栈结构的)
底层使用数组实现
package ch4;
/**
* 栈
* @author Howard
* 特点:
* 1、通常情况作为程序员的工具集来用
* 2、受限访问,不可直接拿中间数据
* 3、更加抽象(主要通过接口定义)
* 4、表现形式为先进后出
*/
public class MyStack {
//底层使用数组来存储数据
private long arr[];
//栈顶的指针
private int top;
/**
* 默认的构造,创建长度为100的数组
*/
public MyStack(){
arr = new long[100];
top = -1;
}
/**
* 带参构造
* 创建对象的时候指定数组大小
* @param maxSize
*/
public MyStack(int maxSize){
arr = new long[maxSize];
//指定为-1原因是,添加数组,保证指针指向第一条数据
top = -1;
}
/**
* 压栈,添加数据
* @param value
*/
public void push(long value){
//++top保证第一次添加加入到数组第一个位置
arr[++top] = value;
}
/**
* 出栈,减少数据
* @return
*/
public long pop(){
//top--保证第一次出栈为栈顶最顶端数据
return arr[top--];
}
/**
* 查看数据,每一次拿出栈顶的数据
* 底层是数组的最后一条数据
* @return
*/
public long peek(){
return arr[top];
}
/**
* 判断栈是否为空
* @return
*/
public boolean isEmpty(){
//指针指向-1位置,说明数组为空,也就是栈为空
return top == -1;
}
/**
* 判断数组是否满了
* @return
*/
public boolean isFull(){
//top位于数组的最大值索引时,满栈
return top == arr.length-1;
}
}
测试栈:
package ch4;
public class TestMyTask {
public static void main(String[] args) {
MyStack myStack = new MyStack(5);
myStack.push(23);
myStack.push(13);
myStack.push(33);
myStack.push(20);
myStack.push(27);
System.out.println(myStack.isEmpty());
System.out.println(myStack.isFull());
System.out.println(myStack.peek());
System.out.println(myStack.peek());
while(!myStack.isEmpty()){
System.out.println(myStack.pop());
}
System.out.println(myStack.isEmpty());
System.out.println(myStack.isFull());
}
}
打印输出:
false
true
27
27
27
20
33
13
23
true
false
2、队列
(Android中的Message是基于队列结构的)
底层使用数组实现
package ch4;
/**
* 1、先进先出与栈相反
* 2、通常情况作为程序员的工具集来用
* @author Howard
*/
public class MyQueue {
//底层使用数组
private long[] arr;
//定义头指针
private int top;
//定义尾指针
private int rear;
//记录元素个数
private int elements;
public MyQueue(int maxSize){
arr = new long[maxSize];
top = 0;
rear = -1;
}
/**
* 增加数据
* @param value
*/
public void insert(long value){
if(rear == arr.length -1){
//实现循环使用。超过以往值就覆盖原来内容
rear = -1;
}
arr[++rear] = value;
elements++;
}
/**
* 移除数据,移除的队列最前面的数据
* @return
*/
public long remove(){
if(top == arr.length){
//实现循环使用。底层top指向了最顶层,让指针再回到数组最开头
top = 0;
}
elements --;
return arr[top++];
}
/**
* 查看数据,查看的队列头部的数据
* @return
*/
public long peek(){
return arr[top];
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
/**
* 是否满了
* @return
*/
public boolean isFull(){
return elements == arr.length;
}
}
测试队列:
false
true
12
12
12
---------------------
12
32
18
10
2
true
false
现在使用数组实现栈和队列,等学习链表时,再用链表实现之。