您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法之栈和队列

2017-01-25 12:18 471 查看
栈和队列以及优先队列是比数组和其他数据结构更加抽象的结构。主要通过接口对栈、队列

和优先级队列进行定义,这些接口表明通过它们可以完成的操作,而它们的主要实现机制对

用户来说是不可见的。

栈每一次只允许访问一个数据项--最后插入的数据项,所以栈又叫先进后出

在这里用数组定义一个栈,代码如下:

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(){
4000

    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);

   }

  

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 数据