第四章 栈和队列

一、概念
栈:栈只允许访问一个数据项,即最后插入的数据项。符合后进先出的规则。
队列:队列是一种类似于栈的数据结构,但是队列的规则是先进先出。

二、栈的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)。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值