在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。
但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除
栈的特点:栈是先进后出,只能访问栈顶的数据
栈的主要机制可以用数组来实现,也可以用链表来实现,
下面用数组来实现栈的基本操作代码:
/**
* 用数组写一个栈
* 栈的特点:栈是先进后出,只能访问栈顶的数据
*/
public class ArrayStack {
private long[] a;
private int size;//栈数组的大小
private int top;//栈顶
public ArrayStack(int maxSize) {
this.size = maxSize;
this.a = new long[size];
this.top = -1;//表示空栈
}
//入栈
public void push(long value){
if(isFull()){
System.out.println("栈已经满!");
return;
}
a[++top] = value;
}
//返回栈顶内容,但是不删除
public void peek(){
if(isEmpty()){
System.out.println("栈中没有数据!");
}
System.out.println(a[top]);
}
//弹出栈顶内容,删除
public long pop(){
if(isEmpty()){
System.out.println("栈中没有数据!");
return 0;
}
return a[top--];
}
//size栈的大小
public int size(){
return top + 1;
}
//是否为空
public boolean isEmpty() {
return (top == -1);
}
//是否满了
public boolean isFull() {
return (top == size - 1);
}
//显示
public void display(){
System.out.print("[");
for (int i = top; i >=0 ; i--) {
System.out.print(a[i]);
if(i!=0){
System.out.print(",");
}
}
System.out.println("]");
}
}
测试代码:
import java.util.Stack;
public class StackDemo {
public static void main(String[] args) {
//真实栈的测试
/*Stack stack = new Stack();
System.out.println(stack);;
stack.push(1);
stack.push("2");
System.out.println(stack.peek());
System.out.println(stack.empty());
System.out.println(stack);
stack.empty();*/
//测试自己写的堆栈
ArrayStack arrayStack = new ArrayStack(5);
arrayStack.display();
System.out.println(arrayStack.isEmpty());
System.out.println(arrayStack.isFull());
arrayStack.push(1);
arrayStack.push(2);
arrayStack.push(3);
arrayStack.display();
arrayStack.peek();
arrayStack.pop();
arrayStack.display();
}
}
总结:
数据项入栈和出栈的时间复杂度均为O(1)。这也就是说,栈操作所消耗的时间不依赖于栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。
其他:
用JAVA数组自己实现链表(单链表,双向链表)
用JAVA数组自己实现一个队列(普通队列以及优先级队列)
java中一些反射,collection,多线程,排序,红黑数,链表等总结整理