2010-05-23 56 views
1

1)我的问题错误显示和插入方法(双端队列)

当我做由右删除或左程序将被删除真实 但是当我打电话diplay方法的内容错误

这样 我插入物12 43 65 23 和时许从左程序删除将删除12 但当呼叫显示方法显示这样12 43 65

和时许从右程序删除将删除23 但是当c所有显示方法如下所示12 43

为什么?????? );

,当我试图使删除写后插入,因为队列已满这

不能正确插入。首先删除权,那么在哪里插入右

哪里出了问题?

请帮我

2)我的代码

FIRST CLASS

class dqueue 
{ 
    private int fullsize;     //number of all cells 
    private int item_num;     // number of busy cells only 
    private int front,rear; 
    public int j; 
    private double [] dqarr; 
//========================================== 
    public dqueue(int s)      //constructor 
    { 
     fullsize = s; 
     front = 0; 
     rear = -1; 
     item_num = 0; 
     dqarr = new double[fullsize]; 
    } 
//========================================== 
    public void insert(double data) 
    { 
     if (rear == fullsize-1) 
      rear = -1; 
     rear++; 
     dqarr[rear] = data; 
     item_num++; 

    } 
    public double removeLeft() // take item from front of queue 
    { 
    double temp = dqarr[front++]; // get value and incr front 
    if(front == fullsize) 
    front = 0; 
    item_num --; // one less item 
    return temp; 
    } 
    public double removeRight() // take item from rear of queue 
    { 
    double temp = dqarr[rear--]; // get value and decr rear 
    if(rear == -1) // 
    rear = item_num -1; 
    item_num --; // one less item 
    return temp; 
    } 
//========================================= 

    public void display()    //display items 
{ 
for (int j=0;j<item_num;j++)    // for every element 
System.out.print(dqarr[j] +" ");   // display it 
System.out.println(""); 
} 

//========================================= 
public int size()    //number of items in queue 
{ 
return item_num; 
} 
//========================================== 
public boolean isEmpty()  // true if queue is empty 
{ 
return (item_num ==0); 
} 


} 

第二类

import java.util.Scanner; 
class dqueuetest 
{ 
    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     System.out.println("    ***** Welcome here***** "); 
     System.out.println("    ***** Mind Of Programming Group***** "); 
     System.out.println("    _____________________________________________ "); 
     System.out.println("enter size of your dqueue"); 
     int size = input.nextInt(); 
     dqueue mydq = new dqueue(size); 
     System.out.println(""); 
     System.out.println("enter your itemes"); 
//===================================== 
     for(int i = 0;i<=size-1;i++) 
     { 
      System.out.printf("item %d:",i+1); 
      double item = input.nextDouble(); 
      mydq.insert(item); 
      System.out.println(""); 
     }  

//===================================== 
int queue =size ;   
int c = 0 ; 
while (c != 6) 
{ 
    System.out.println(""); 
    System.out.println("************************************************"); 
    System.out.println("    MAIN MENUE"); 
    System.out.println("1- INSERT RIGHT "); 
    System.out.println("2- REMOVE LEFT"); 
    System.out.println("3- REMOVE RIGHT"); 
    System.out.println("4- DISPLAY"); 
    System.out.println("5- SIZE"); 
    System.out.println("6- EXIT"); 
    System.out.println("************************************************"); 
    System.out.println("choose your operation by number(1-6)"); 
    c = input.nextInt(); 
    switch (c) 
    { 
    case 1: 
    if (queue == size) 
    System.out.print("Can not insert right because the queue is full . first remove right and then u can insert right "); 
      else { System.out.print("enter your item: "); 
      double item = input.nextDouble(); 
      mydq.insert(item);} 
      break; 

    case 2: 
     System.out.println("REMOVE FROM REAR :"); 
       if(!mydq.isEmpty()) 
    { 
    double item = mydq.removeLeft(); 

    System.out.print(item + "\t"); 
    } // end while 
    System.out.println(""); 
    mydq.display(); 

    break; 

    case 3: 
    System.out.println("REMOVE FROM FRONT :"); 
      if(!mydq.isEmpty()) 
    { 
    double item = mydq.removeRight(); 

    System.out.print(item + "\t"); 
    } // end while 
    System.out.println(""); 
    mydq.display(); 
    break; 

    case 4: 
    System.out.println("The items in Queue are :"); 
     mydq.display(); 
    break; 

    case 5: 
    System.out.println("The Size of the Queue is :"+mydq.size()); 
    break; 

    case 6: 
    System.out.println("Good Bye"); 

    break; 

    default: 
    System.out.println("wrong chiose enter again"); 
    }  //end switch 
}  //end while 
}  // end main  

}//end class 
+2

为您重新设置了代码(仍然是一团糟,但比以前更糟糕),并添加了明显缺少的java标记(显示标记绝对没有任何意义,但我不明白您的意思足以帮助)。我建议进一步编辑和标记说明,以使这个问题不再是一场灾难,目前它仍然是, – 2010-05-23 15:14:22

+0

thanxs。 我有问题在显示方法 我从左边删除,但当我调用显示删除后,我发现从右边的元素它是删除不剩^^ – MANAL 2010-05-23 16:38:27

+0

在这个问题* * * *和* ??? *太多的哭泣。 – whiskeysierra 2010-05-23 22:25:21

回答

1

我怀疑这是WH在迷惑你的就是你的display方法...:

public void display()    //display items 
{ 
    for (int j=0;j<item_num;j++)    // for every element 
     System.out.print(dqarr[j] +" ");   // display it 
    System.out.println(""); 
} 
在此方法中你完全忽略了你所编码的队列,这关键取决于 frontrear指数的“内部逻辑结构”

:的确,注意你甚至没有提及这些指标无论是在这里 - 你只是打印了“身体第一” item_num元素,有任何与“逻辑上存在”的人没有任何关系。

你需要,相反,与front个元素(0个一种!)启动并显示item_num元素开始出现(在最后与环绕如果你遇到它,当然)。这将显示您的队列的逻辑内容,而不是实现它的阵列的“随机OID”片 - !)

+0

取悦更多解释 ): – MANAL 2010-05-23 16:39:15

1

display遍历从0支持数组,直到item_num的实现,所以它打印错误的价值观。应该迭代从frontrear代替(与检查周围包裹索引处的缓冲区的末尾),以打印出队列的实际内容:

public void display() { 
    int j = front; 
    for (int count = 0; count < item_num; count++) { 
    System.out.print(dqarr[j] + " "); 
    j = increment(j); 
    } 
    System.out.println(); 
} 

private int increment(int index) { 
    if (index == fullsize - 1) 
    return 0; 
    return ++index; 
} 

我所定义的increment方法来实现索引步进一个地方 - 你在你的代码中有多个地方。

另外请注意,在您的实现中没有溢出检查:如果我将fullsize + 1元素添加到队列中,则第一个元素将被自动覆盖。

更新:我意识到,在你的队列实现rear指标队列的最后一个元素(不是的最后一个元素之后的一个,如在出队实现我所看到的通常的),所以我修改了代码例如和我的答案相应。

+0

仍有问题 当我用你的方法显示使从删除这两个右和后方 :(:( 这样 我插入12 34 45 67 并做出从左 删除了放变成这样34 45 ):): 请帮我 – MANAL 2010-05-23 16:35:18

+0

@MANAL,看我的更新。 – 2010-05-24 19:19:28