栈和队列以及优先队列是比数组和其他数据结构更加抽象的结构。主要通过接口对栈、队列
和优先级队列进行定义,这些接口表明通过它们可以完成的操作,而它们的主要实现机制对
用户来说是不可见的。
栈每一次只允许访问一个数据项--最后插入的数据项,所以栈又叫先进后出
在这里用数组定义一个栈,代码如下:
public class StackX {
private int maxSize;
private long[] stackArray;
private int top;
public StackX(int s) {
maxSize=s;
stackArray=new long[maxSize];
top=-1;
}
public void push(long j){
stackArray[++top]=j;
}
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);
}
}
关于栈的常用操作一般用弹栈(POP)操作和入栈(PUSH)操作
弹栈的时候先取出栈顶指针所对应的元素,然后栈顶指针向下移动一个位置,
当然这里还有一个操作就是判断栈是否为空,如果为空,就弹出错误说:栈为空
入栈的时候,栈顶指针先向上移动一个位置,然后再把元素查到栈顶指针对应的位置,
对了,在插入元素之前,应该有一个判断,就是判断栈是否已经满了。
栈的效率:由于栈的插入和删除操作都只进行了一次移动:所以栈的时间复杂度为:O(1)
队列和栈实际上是差不多的,只不过栈是先进后出,而队列是先进先出,。
public class Queue {
private int maxSize;
private long[] queArray;
private int front;
private int rear;
private int nItems;
public Queue(int maxSize) {
this.maxSize = maxSize;
queArray=new long[maxSize];
front=0;
rear=-1;
nItems=0;
}
public void insert(long j){//向队列中插入一个元素
if(rear==maxSize-1){
rear=-1;
}
queArray[++rear]=j;
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;
}
}
队列的操作也包括插入和删除,在插入之前,要判断队列是否已经满了,在删除之前要判断
队列是否已经为空,不过上面定义的队列并不是循环队列。所谓循环队列就是把队列的头和尾
连到一块。
优先级队列:
优先级队列是比栈和队列更专用的数据结构,优先级队列和队列的区别是在优先级队列中数据
项是按关键字的值有序:可能是关键字最小的数据项总是在队头,也有可能是关键字最大的数
据项总是在队头,下面的代码是关键字最小的数据项总是在队头:
public class PriorityQ {
private int maxSize;
private long[] queArray;
private int nItems;
public PriorityQ(int maxSize) {
this.maxSize = maxSize;
queArray=new long[maxSize];
nItems=0;
}
public void insert(long item){
int j;
if(nItems==0){
queArray[nItems++]=item;
}else{
for(j=nItems-1;j>=0;j--){
if(item>queArray[j]){
queArray[j+1]=queArray[j];
}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);
}
和优先级队列进行定义,这些接口表明通过它们可以完成的操作,而它们的主要实现机制对
用户来说是不可见的。
栈每一次只允许访问一个数据项--最后插入的数据项,所以栈又叫先进后出
在这里用数组定义一个栈,代码如下:
public class StackX {
private int maxSize;
private long[] stackArray;
private int top;
public StackX(int s) {
maxSize=s;
stackArray=new long[maxSize];
top=-1;
}
public void push(long j){
stackArray[++top]=j;
}
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);
}
}
关于栈的常用操作一般用弹栈(POP)操作和入栈(PUSH)操作
弹栈的时候先取出栈顶指针所对应的元素,然后栈顶指针向下移动一个位置,
当然这里还有一个操作就是判断栈是否为空,如果为空,就弹出错误说:栈为空
入栈的时候,栈顶指针先向上移动一个位置,然后再把元素查到栈顶指针对应的位置,
对了,在插入元素之前,应该有一个判断,就是判断栈是否已经满了。
栈的效率:由于栈的插入和删除操作都只进行了一次移动:所以栈的时间复杂度为:O(1)
队列和栈实际上是差不多的,只不过栈是先进后出,而队列是先进先出,。
public class Queue {
private int maxSize;
private long[] queArray;
private int front;
private int rear;
private int nItems;
public Queue(int maxSize) {
this.maxSize = maxSize;
queArray=new long[maxSize];
front=0;
rear=-1;
nItems=0;
}
public void insert(long j){//向队列中插入一个元素
if(rear==maxSize-1){
rear=-1;
}
queArray[++rear]=j;
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;
}
}
队列的操作也包括插入和删除,在插入之前,要判断队列是否已经满了,在删除之前要判断
队列是否已经为空,不过上面定义的队列并不是循环队列。所谓循环队列就是把队列的头和尾
连到一块。
优先级队列:
优先级队列是比栈和队列更专用的数据结构,优先级队列和队列的区别是在优先级队列中数据
项是按关键字的值有序:可能是关键字最小的数据项总是在队头,也有可能是关键字最大的数
据项总是在队头,下面的代码是关键字最小的数据项总是在队头:
public class PriorityQ {
private int maxSize;
private long[] queArray;
private int nItems;
public PriorityQ(int maxSize) {
this.maxSize = maxSize;
queArray=new long[maxSize];
nItems=0;
}
public void insert(long item){
int j;
if(nItems==0){
queArray[nItems++]=item;
}else{
for(j=nItems-1;j>=0;j--){
if(item>queArray[j]){
queArray[j+1]=queArray[j];
}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);
}