一、概念
栈:栈只允许访问一个数据项,即最后插入的数据项。符合后进先出的规则。
队列:队列是一种类似于栈的数据结构,但是队列的规则是先进先出。
二、栈的Java写法
class StackX {
private int maxSize; //最大容量
private long[] stackArray; //数组
private int top; //存储栈顶元素的下标
public StackX(int size) {
maxSize = size;
stackArray = new long[maxSize];
top = -1;
}
public void push(long value) {
stackArray[++top] = value;
}
public long pop() {
return stackArray[top—];
}
public long peek() {
return stackArray[top];
}
public boolean isEmpty() {
return top == -1;
}
public boolean isFull() {
return top == (maxSize -1);
}
}
三、栈的效率
数据项入栈和出栈的时间复杂度都为常数O(1)。即栈操作所耗的时间不依赖于栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。
四、队列的Java写法
class Queue {
private int maxSize;
private long[] queArray;
private int front;
private int rear;
private int nItems;
public Queue(int size) {
maxSize = size;
queArray = new long[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
public void insert(long value) {
if(rear == maxSize-1) //如果队尾指针要超过最大容量了,循环到头部
rear = -1;
queArray[++rear] = value;
nItems++;
}
public long remove() {
long temp = queArray[front++];
if(front == maxSize) //如果队头指针到了队尾了,循环到头部
front = 0;
nItems—;
return temp;
}
public long peekFront() {
return queArray[front];
}
public boolean isEmpty() {
return nItems == 0;
}
public boolean isFull() {
return nItems == maxSize;
}
public int size() {
return nItems;
}
}
五、队列的效率
和栈一样。
六、双端队列
双端队列就是一个两端都是结尾的队列,队列的每一端都可以插入、删除数据项。
七、优先级队列
在优先级队列中,数据项按关键字的值有序,这样关键字最小的数据项总是在队头。数据项在插入的时候会按照顺序插入到合适的位置以确保队列的顺序。
class PriorityQue {
private int maxSize;
private long[] queArray;
private int nItems;
public PriorityQue(int size) {
maxSize = size;
queArray = new long[maxSize];
nItems = 0;
}
public void insert(long item) {
int i;
if(nItems == 0) {
queArray[nItems++] = item; //如果队列中没有数据项,就插入到下标为0的单元里。
} else {
//从数组的顶部开始上移存在的数据项,直到找到新数据项应当插入的位置
for(i = nItems-1;i > 0;i—) {
if(item > queArray[i])
queArray[i+1] = queArray[i]
else
break;
}
queArray[j+1] = item;
nItems++;
}
}
public long remove() {
return queArray[—nItems];
}
public long peekMin() {
return queArray[nItems-1];
}
public boolean isEmpty() {
return nItems == 0;
}
public boolean isFull() {
return nItems == maxSize;
}
}
优先级队列的插入操作需要O(N),而删除操作只要O(1)。