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

栈和队列以及优先队列是比数组和其他数据结构更加抽象的结构。主要通过接口对栈、队列
和优先级队列进行定义,这些接口表明通过它们可以完成的操作,而它们的主要实现机制对
用户来说是不可见的。
栈每一次只允许访问一个数据项--最后插入的数据项,所以栈又叫先进后出
在这里用数组定义一个栈,代码如下:
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);
   }
  
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_Yoda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值