如何使用静态方法.Schildt将队列复制到其他队列

时间:2018-08-15 18:01:54

标签: java queue

在此练习中,需要: 创建一个静态方法,将一种队列类型的内容复制到另一种队列中。真的,我还不知道该怎么做。请帮助我:(

我试图像这样创建新类,但实际上他什么也不显示,我明白了,因为我看到了一个返回方法get(),然后他们返回--Queue为空,好吧,我知道,但是我如何用char返回数组?还是别的,哦,我现在不:(

 public class TestQueue { 
   public static void CQueue(ICharQ a) {

  a.get();
   System.out.println("  " + a);
  }
}

界面:

public interface ICharQ{        
    void put (char ch);  //putting symb to queue
    char get(); 

    void reset ();
    default char reset1(){return '-';}
}

队列代码:

 class FixedQueue implements ICharQ {
private char q[]; // this array holds the queue
private int putloc, getloc; // the put and get indices

// Construct an empty queue given its size.

public FixedQueue(int size) {
    q = new char[size]; // allocate memory for queue

    putloc = getloc = 0;
}

// Put a characer into the queue.

public void put(char ch) {
    if(putloc==q.length) {
        System.out.println(" -- Queue is full.");
        return;
    }

    q[putloc++] = ch;
}

// Get a character from the queue.

public char get() {
    if(getloc == putloc) {

        System.out.println(" -- Queue is empty.");

        return (char) 0;

    }

    return q[getloc++];
}

}

//循环队列。

class CircularQueue implements ICharQ {
private char q[]; // this array holds the queue
private int putloc, getloc; // the put and get indices

// Construct an empty queue given its size.

public CircularQueue(int size) {
    q = new char[size+1]; // allocate memory for queue
    putloc = getloc = 0;
}

// Put a characer into the queue.

public void put(char ch) {
/* Queue is full if either putloc is one less than
   getloc, or if putloc is at the end of the array
   and getloc is at the beginning. */

    if(putloc+1==getloc |
            ((putloc==q.length-1) & (getloc==0))) {
        System.out.println(" -- Queue is full.");
        return;
    }

    q[putloc++] = ch;
    if(putloc==q.length) putloc = 0; // loop back

}

// Get a character from the queue.

public char get() {
    if(getloc == putloc) {
        System.out.println(" -- Queue is empty.");
        return (char) 0;
    }

    char ch = q[getloc++];
    if(getloc==q.length) getloc = 0; // loop back
    return ch;
}
public void reset(int res) {
    putloc=getloc=0;
    q = new char[res];
    System.out.println(" ---Queue have not items= ZERO"+q);

}

}

//一个动态队列。

class DynQueue implements ICharQ {
private char q[]; // this array holds the queue
private int putloc, getloc; // the put and get indices

// Construct an empty queue given its size.

public DynQueue(int size) {
    q = new char[size]; // allocate memory for queue
    putloc = getloc = 0;
}
// Put a characer into the queue.
public void put(char ch) {
    if(putloc==q.length) {
        // increase queue size
        char t[] = new char[q.length * 2];

        // copy elements into new queue

        for(int i=0; i < q.length; i++)
            t[i] = q[i];

        q = t;
    }

    q[putloc++] = ch;
}

// Get a character from the queue.

public char get() {
    if(getloc == putloc) {
        System.out.println(" -- Queue is empty.");
        return (char) 0;
    }

    return q[getloc++];
}
public void reset(int res) {
    putloc=getloc=0;
    q = new char[res];
    System.out.println(" ---Queue have not items= ZERO"+q[10]);

}

}

// Demonstrate the ICharQ interface.

    class IQDemo {
public static void main(String args[]) {
    FixedQueue q1 = new FixedQueue(10);
    DynQueue q2 = new DynQueue(10);
    CircularQueue q3 = new CircularQueue(10);

    ICharQ iQ;

    char ch;
    int i;

    iQ = q1;
    // Put some characters into fixed queue.

    for(i=0; i < 10; i++)
        iQ.put((char) ('A' + i));

    // Show the queue.

    System.out.print("Contents of fixed queue: ");
    for(i=0; i < 10; i++) {
        ch = iQ.get();
        System.out.print(ch);
    }



    System.out.println();

    iQ = q2;

    // Put some characters into dynamic queue.

    for(i=0; i < 10; i++)
        iQ.put((char) ('Z' - i));

    // Show the queue.

    System.out.print("Contents of dynamic queue: ");
    for(i=0; i < 10; i++) {
        ch = iQ.get();
        System.out.print(ch);
    }

    System.out.println();

    iQ = q3;
    // Put some characters into circular queue.

    for(i=0; i < 10; i++)
        iQ.put((char) ('A' + i));

    // Show the queue.

    System.out.print("Contents of circular queue: ");
    for(i=0; i < 10; i++) {
        ch = iQ.get();
        System.out.print(ch);
    }

    System.out.println();

    // Put more characters into circular queue.

    for(i=10; i < 20; i++)
        iQ.put((char) ('A' + i));

    // Show the queue.

    System.out.print("Contents of circular queue: ");
    for(i=0; i < 10; i++) {
        ch = iQ.get();
        System.out.print(ch);
    }

    System.out.println("\nStore and consume from" +
            " circular queue.");

    // Use and consume from circular queue.

    for(i=0; i < 20; i++) {
        iQ.put((char) ('A' + i));
        ch = iQ.get();
        System.out.print(ch);


  } 
  }  
}

3 个答案:

答案 0 :(得分:0)

请考虑复制队列时所需的输入和输出。创建副本需要什么?首先,您需要原始的Queue,然后需要返回原始的副本。

public static ICharQ /*copy*/ CQueue(ICharQ original)

现在使用可用的界面方法

put (char ch);
char get();

您可以使用已知方法创建一个循环,该循环从原始队列get()抓取一个字符直到其为空,然后使用put (char ch)

将每个字符插入副本中

现在使用上面提到的所有方法创建一个循环算法,直到没有字符要复制并返回创建的副本为止。

public static ICharQ CQueue(ICharQ original)
{
    ICharQ copy = new FixedQueue(); //change this to use an if/else using instance of, won't work currently because it only returns a FixedQueue

    Character copyChar;

    while((copyChar = original.get()) != '0')
        copy.put(copyChar);

    return copy;
}

答案 1 :(得分:0)

队列接口仅提供几种方法,并且原理很简单(FIFO-先入先出),方法也很简单( add,offer,poll,peek )。所以你只能放到最后,只能从头上拿走。

使用Queue接口,如果不从源队列中删除元素,就无法将一个队列中的元素复制到另一队列中。

如果要实现自己的Queue,它还应该实现Iterable接口,以便它可以提供从元素末尾到头部的Iterator。这样,您可以获得迭代器,并将每个元素添加到目标队列。

答案 2 :(得分:0)

似乎可以通过添加q的get和set方法,putloc和getloc并分别在每个类中实现它们,然后在ICharQ接口中实现静态copy()方法来解决此问题。 这是我添加到ICharQ的代码段:

 void setQ(char[] q);

    char[] getQ();

    int getPutloc();

    int getGetloc();

    void setPutloc(int p);

    void setGetloc(int g);

    static ICharQ copy(ICharQ a, ICharQ b) {
        b.setQ(a.getQ());
        b.setPutloc(a.getPutloc());
        b.setGetloc(a.getGetloc());
        return b;
    }

这是类中的实现:

public void setQ(char[] q) {
        char[] a = new char[q.length];
        System.arraycopy(q, 0, a, 0, q.length);
        this.q = a;
    }

    public char[] getQ() {
        return q;
    }

    public int getPutloc() {
        return putloc;
    }

    public int getGetloc() {
        return getloc;
    }

    public void setPutloc(int p) {
        putloc = p;
    }

    public void setGetloc(int g) {
        getloc = g;
    }
从main调用时,外观如下:

        ICharQ.copy(q1, q2);

但是,我希望转换为CircularQueue时可能会出现问题,因为它需要为数组大小增加+1-不幸的是,尚未解决该小问题。 P. S.不要严格判断,只是在一个月前才开始学习,但是发现这项任务非常有趣,并且希望在这里进行更多讨论。