棧
先進後出,底層就是一個數組。
首先java中的Stack繼承Vector
實例化
Stack stack=new Stack();
寫一個底層原理
public class MyStack1<E> {
private Object[] stack;
private int size;
public MyStack1() {
stack = new Object[10];
//初始長度爲10
}
public MyStack1(int initSize) {
stack = new Object[initSize];
//初始長度爲10
}
/**
* 判斷棧是否爲空
* */
public boolean isEmpty() {
return size == 0;
}
/**
* 返回棧頂的一個元素,但是不進行出棧操作
* */
public E peek() {
if(isEmpty()) {
return null;
}
return (E)stack[size -1];
//返回棧頂元素
}
/**
* 彈出
* */
public E pop() {
E e = peek();
//取得棧頂數據
if(size > 0) {
//檢查棧中是否有數據
stack[size - 1] = null;
//將出棧後的位置置爲空
size--;
}
//將棧中元素個數減一
return e;
}
/**
* 壓入
* */
public E push(E item) {
ensureCapacity(size + 1);
stack[size++] = item;
return item;
}
/**
* 當棧滿的時候,對棧進行擴容
* */
private void ensureCapacity(int size) {
int len = stack.length;
if(size > len) {
//數組已滿
int newLen = 10;
//每次數組擴充的容量
stack = Arrays.copyOf(stack, newLen);
}
}
/**
* 打印出棧中所有的數據
* */
public void printStack() {
System.out.println("開始進行出棧:");
while(size > 0) {
System.out.println("出棧:" + pop());
}
System.out.println("出棧操作結束!");
}
}
E代表泛型
隊列
LinkedList類實現了Queue接口
Queue<String> queue = new LinkedList<String>();
簡單實現
public class MyQueue {
//底層使用數組
private long[] arr;
//有效數據的大小
private int elements;
//隊頭
private int front;
//隊尾
private int end;
public MyQueue(){
arr = new long[10];
elements =0;
front =0;
end = -1;
}
public MyQueue(int maxsize){
arr = new long[maxsize];
elements =0;
front =0;
end = -1;
}
public void insert(long value){
arr[++end] = value;
elements++;
}
public long remove(){
elements--;
return arr[front++];
}
public long peek(){
return arr[front];
}
public boolean isEmpty(){
return elements ==0;
}
public boolean isFull(){
return elements == arr.length;
}
}