队列的顺序存储和链式存储

文章讲述了顺序存储的队列类(如SqQueueClass)和链式存储的队列类(如LinkQueueClass)的实现,包括push、pop、peek操作,以及如何在示例代码中使用它们。重点介绍了数组队列的索引管理和链式队列的特点。
摘要由CSDN通过智能技术生成

顺序存储

package 栈的应用.SqQueue_4;

import java.util.Arrays;

public class SqQueueClass<E> {
    public E data[];
    final int MaxSize=10;
    int front,rear;
    public SqQueueClass()
    {
        data=(E[]) new Object[MaxSize];
//        front=rear=-1;
        front=rear=0;//牺牲front不存放数据,则就表示它一直指向队首前一个位置
    }
    public boolean isEmpty()
    {
        return front==rear;
    }
//    public boolean isFull()
//    {
//        return (rear+1)%MaxSize==front;//!!!!!
//    }
    public void push(E e)
    {
        if((rear+1)%MaxSize==front)
            //if(rear==MaxSize-1)
            throw new IllegalArgumentException("队满");
//        rear++;
        rear=(rear+1)%MaxSize;//!!!!
        data[rear]=e;
    }
    public E pop()
    {
        if(isEmpty())
            throw new IllegalArgumentException("队空");
//        front++;
          front=(front+1)%MaxSize;
        return data[front];
    }
    public E peek()
    {
        if(isEmpty())
            throw new IllegalArgumentException("队空");
//        return data[front+1];//+1很重要
        return data[(front+1)%MaxSize];
    }
    public void show()
    {
        for(int i=0;i<data.length;i++)
        {
            System.out.print(data[(front+i)%MaxSize]+" ");
        }
        System.out.println();
    }
}

package 栈的应用.SqQueue_4;

import java.sql.SQLOutput;

public class SqQueueDemo1 {
    public static void main(String[] args) {
        String s="123456789";
        SqQueueClass q=new SqQueueClass();
        String ss[]=s.split("");
        for(String a:ss)
        {
            q.push(a);
            System.out.print("此时队中数据为:");
            q.show();
        }
        q.pop();
        System.out.print("出队后:");
        q.show();
        System.out.print("取栈顶元素:"+q.peek());
    }
}

package 栈的应用.SqQueue_4;

public class SqQueueClass2<E> {
    public E data[];
    final int MaxSize=10;
    int front,rear;
    boolean tag;
    public SqQueueClass2()
    {
        data=(E[]) new Object[MaxSize];
        front=rear=0;
        tag=true;
    }
    public boolean isEmpty()
    {
        if (tag&&front==rear)
            return true;
        else
            return false;
    }
    public void push(E e)
    {
        if(!tag&&rear==front)
            //if(rear==MaxSize-1)
            throw new IllegalArgumentException("队满");
        data[rear]=e;
        rear=(rear+1)%MaxSize;
        tag=false;
    }
    public E pop()
    {
        if(rear==front&&tag)
            throw new IllegalArgumentException("队空");
        else
        {
            front=(front+1)%MaxSize;
            if(rear==front)
                tag=true;
            return data[front];
        }

    }
    public E peek()
    {
        if(rear==front&&tag)
            throw new IllegalArgumentException("队空");
        else
        {
            if(rear==front)
                tag=true;
            return data[front];
        }
    }
    public void show()
    {
        for(int i=0;i<data.length;i++)
        {
            System.out.print(data[(front+i)%MaxSize]+" ");
        }
        System.out.println();
    }
}

package 栈的应用.SqQueue_4;

public class SqQueueDemo2 {
    public static void main(String[] args) {
        String s="1234567890";
        SqQueueClass2 q2=new SqQueueClass2();
        String ss[]=s.split("");
        for(String a:ss)
        {
            q2.push(a);
            System.out.print("此时队中数据为:");
            q2.show();
        }
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        System.out.print("取栈顶元素:"+q2.peek());
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
        q2.pop();
        System.out.print("出队后:");
        q2.show();
//        q2.pop();
//        System.out.print("出队后:");
//        q2.show();
        q2.push("a");
        q2.show();
        q2.push("b");
        q2.show();
    }
}

链式存储:

package 栈的应用.SqQueue_4.LinkQueue_4;
public class LinkNode<E> {
   public E data;
   public LinkNode next;
   public LinkNode()
   {
       next=null;
   }
   public LinkNode(E e)
   {
       data=e;
       next=null;
   }
}

package 栈的应用.SqQueue_4.LinkQueue_4;

public class LinkQueueClass<E> {
    LinkNode<E> front;
    LinkNode<E> rear;
    public LinkQueueClass()
    {
        front=rear=new LinkNode<>();
        front.next=null;
        rear.next=null;
    }
    public boolean isEmpty()
    {
        return front==rear;
    }
    public void push(E e)
    {
        LinkNode<E> s=new LinkNode<>(e);
       s.next=null;
        rear.next=s;
        rear=s;
    }
    public E pop()
    {
        if(isEmpty())
            throw new IllegalArgumentException("队空");
        E a= (E) front.next.data;
        front.next=front.next.next;
        if(front.next==null)
        {
            rear=front;
        }
        return a;
    }
    public E peek()
    {
        if(isEmpty())
            throw new IllegalArgumentException("队空");
        E a= (E) front.next.data;
//        front.next=front.next.next;
//        if(front.next==null)
//        {
//            rear=front;
//        }
        return a;
    }
    @Override
    public String toString() {
        String res="";
        LinkNode p=front.next;
        while(p!=null)
        {
            res+=p.data+" ";
            p=p.next;
        }
        return res;
    }
}

package 栈的应用.SqQueue_4.LinkQueue_4;

public class LinkQueueDemo {
    public static void main(String[] args) {
        String s1="1234567";
        LinkQueueClass<String> q=new LinkQueueClass<>();
        String ss[]=s1.split("");
        for(String a:ss)
        {
            q.push(a);
            System.out.print("此时队中数据:");
            System.out.println(q.toString());
        }
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        System.out.println("取队顶"+q.peek());

    }
}

package 栈的应用.SqQueue_4.LinkQueue_4;

public class LinkCQueueClass<E> {
    LinkNode rear;
    public LinkCQueueClass()
    {
        rear=null;
    }
    public boolean isEmpty()
    {
        return rear==null;
    }
    public void push(E e)
    {
        LinkNode s=new LinkNode(e);
        if(rear==null)
        {
            s.next=rear;
            rear.next=s;
        }
        else
        {
            s.next=rear.next;
            rear.next=s;
            rear=s;
        }
    }
    public E pop()
    {
        if(isEmpty())
            throw new IllegalArgumentException("队空");
        E a=(E)rear.data;
        rear.next=rear.next.next;
        if(rear.next==rear)
        {
            rear=rear;
        }
        return a;
    }
    public E peek()
    {
        if(isEmpty())
            throw new IllegalArgumentException("队空");
        E a=(E)rear.data;
        return a;
    }
    public String toString() {
        String res="";
        LinkNode p=rear;
        while(p!=null)
        {
            res+=p.data+" ";
            p=p.next;
        }
        return res;
    }
}

package 栈的应用.SqQueue_4.LinkQueue_4;

public class LinkCQueueDemo {
    public static void main(String[] args) {
        String s1="1234567";
        LinkQueueClass<String> q=new LinkQueueClass<>();
        String ss[]=s1.split("");
        for(String a:ss)
        {
            q.push(a);
            System.out.print("此时队中数据:");
            System.out.println(q.toString());
        }
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        System.out.println("取队顶"+q.peek());
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());
        q.pop();
        System.out.println("出队后队中数据: "+q.toString());


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值