有些东西,在我进行初学的时候,会有一些或多或少的比喻写在注释里面,可能那些比喻并不是太准确,但是至少在我看来应该还是没有多大的问题的!
栈
package ch03;
/**
* 自我心得:这是一个模仿的栈结构。并非真正的栈。比如移除操作,并不是真正的移除了,而是我们控制了栈的指针罢了,元素并没有真正的移除消失
* @author ASUS
*
*/
public class MyStack {
//栈底层实现是一个数组
private long[] arr;
//栈顶指针标识
private int top;
/**
* 默认的无参构造
*/
public MyStack(){
arr = new long[10];
top = -1;//栈的初始化中,没有一个参数。所以top=-1
}
/**
* 带参数的构造方法,参数为数组初始化大小
* @param maxsize
*/
public MyStack(int maxsize){
arr = new long[maxsize];
top = -1;
}
/**
* 添加数据
* @param value
*/
public void push(int value){
arr[++top] = value;//简单理解为先栈顶指针加1,之后赋值数组
}
/**
* 移除元素
* @return
*/
public long pop(){
return arr[top--];//简单理解为先返回要取出的元素,栈顶指针减一
}
/**
* 查看数据
* @return
*/
public long peek(){
return arr[top];
}
/**
* 判断是否为空,判断栈顶指针为-1
* @return
*/
public boolean isEmpty(){
return top == -1;
}
/**
* 判断是否满了 栈顶指针是否等于数组长度减一
* @return
*/
public boolean isFull(){
return top ==arr.length-1;
}
}
栈测试
package ch03;
public class TestMyStack {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyStack mStack = new MyStack(4);
mStack.push(23);
mStack.push(12);
mStack.push(1);
mStack.push(90);
System.out.println(mStack.isEmpty());
System.out.println(mStack.isFull());
while(!mStack.isEmpty()){
System.out.print(mStack.pop()+",");
}
System.out.println(mStack.isEmpty());
System.out.println(mStack.isFull());
}
}
队列
package ch03;
/**
* 用java语法模拟普通队列的操作
* 可以假象的场景为排队买票,从尾插入,从头移除
* 这个普通的队列模拟的插入移除存在空指针移除的风险,建议使用循环队列
* @author ASUS
*
*/
public class MyQueue {
//队列的底层实现是数组
private long[] arr;
private Integer elements;//记录有效数据
private int front;
private int end;
/**
* 默认无参构造
*/
public MyQueue() {
// TODO Auto-generated constructor stub
arr = new long[10];
elements = 0;
front = 0;//队列的头指针默认为0
end = -1;//队列的尾指针默认为-1
}
public MyQueue(int maxsize) {
// TODO Auto-generated constructor stub
arr = new long[maxsize];
elements = 0;
front = 0;
end = -1;
}
/**
* 插入操作
* @param value
*/
public void insert(long value){
arr[++end] = value;
elements++;
}
/**
* 移除操作
* @return
*/
public long remove(){
elements--;
return arr[front++];
}
/*
* 查看队头元素
*/
public long peek(){
return arr[front];
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
/**
* 判断是否满了
* @return
*/
public boolean isFull(){
return elements == arr.length;
}
}
循环队列(只是在插入和移除这两个方法中,做了稍微的改动)
package ch03;
/**
* 用java语法模拟循环队列的操作
* 可以假象的场景为排队买票,从尾插入,从头移除
* @author ASUS
*
*/
public class MyCycleQueue {
//队列的底层实现是数组
private long[] arr;
private Integer elements;//记录有效数据
private int front;
private int end;
/**
* 默认无参构造
*/
public MyCycleQueue() {
// TODO Auto-generated constructor stub
arr = new long[10];
elements = 0;
front = 0;//队列的头指针默认为0
end = -1;//队列的尾指针默认为-1
}
public MyCycleQueue(int maxsize) {
// TODO Auto-generated constructor stub
arr = new long[maxsize];
elements = 0;
front = 0;
end = -1;
}
/**
* 插入操作
* @param value
*/
public void insert(long value){
if (end == arr.length-1) {
end = -1;
}
arr[++end] = value;
elements++;
}
/**
* 移除操作
* @return
*/
public long remove(){
long value = arr[front++];
if (front == arr.length) {
front = 0;
}
elements--;
return value;
}
/*
* 查看队头元素
*/
public long peek(){
return arr[front];
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
/**
* 判断是否满了
* @return
*/
public boolean isFull(){
return elements == arr.length;
}
}
队列测试
package ch03;
public class TestMyQueue {
public static void main(String[] args) {
// TODO Auto-generated method stub
//MyQueue myQueue = new MyQueue(4);
MyCycleQueue myQueue = new MyCycleQueue(4);
myQueue.insert(23);
myQueue.insert(24);
myQueue.insert(13);
myQueue.insert(1);
System.out.println(myQueue.isEmpty());
System.out.println(myQueue.isFull());
System.out.println(myQueue.peek());
System.out.println(myQueue.peek());
while(!myQueue.isEmpty()){
System.out.print(myQueue.remove()+" ");
}
System.out.println();
System.out.println(myQueue.isEmpty());
System.out.println(myQueue.isFull());
System.out.println("----------------");
myQueue.insert(23);
myQueue.insert(24);
myQueue.insert(13);
myQueue.insert(1);
while(!myQueue.isEmpty()){
System.out.println(myQueue.remove()+" ");
}
}
}
本文主要探讨了数据结构中的栈和队列。通过对栈的测试,展示了其后进先出(LIFO)的特点;同时,介绍了队列,特别是循环队列的概念,强调了其先进先出(FIFO)的性质,并通过实例说明了队列插入和移除操作的改进。
1305

被折叠的 条评论
为什么被折叠?



