在此练习中,需要: 创建一个静态方法,将一种队列类型的内容复制到另一种队列中。真的,我还不知道该怎么做。请帮助我:(
我试图像这样创建新类,但实际上他什么也不显示,我明白了,因为我看到了一个返回方法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);
}
}
}
答案 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;
}
ICharQ.copy(q1, q2);
但是,我希望转换为CircularQueue时可能会出现问题,因为它需要为数组大小增加+1-不幸的是,尚未解决该小问题。 P. S.不要严格判断,只是在一个月前才开始学习,但是发现这项任务非常有趣,并且希望在这里进行更多讨论。