カスタムリニアおよび非線形ストレージのキュー実装
14481 ワード
通常のプログラミングでは,キューは多くの面で応用できる.生活の中で私达は同様に随所にその影を见ることができて、例えば私达は列に并んで、先に并んだ人は先にサービスを得て、后に入った人は后でサービスを受けます.これがキューです.はっきり言って、FIFO原則(First in First out、先進先出)です.キューの実装は、ストレージ構造によって異なり、通常は2つの方法でストレージされます.リニアストレージまたは非ラインストレージ.
1、リニアストレージ.配列などの長さ固定の記憶方式に基づいて実現される.ここではまずインタフェースを定義し、インタフェースに基づいて実現します.コードを見てください.
次はテストクラスです.
テストの結果です
2、もちろん非線形のストレージ構造を用いてキューを実現することも可能であり、利点は「偽オーバーフロー」現象を回避し、空間に十分に利用できることである.コード実装は次のとおりです.
次は私のテストコードです.
テストの結果は次のとおりです.
結果分析:チェーンキューに値が格納されている場合、文字列タイプは正常に格納されていないことがわかります.しかし、これはキューが文字列タイプのデータを格納できないわけではないので、注意してください.そうでなければ、今後のソフトウェアのエラーを引き起こす可能性があります.次はもっと完全な非線形のキューの実現コードで、私が入隊して操作に失敗した後に修正されたブログでもあります.あなたと一緒に勉強して、一緒に進歩しましょう.非線形キューの実装
1、リニアストレージ.配列などの長さ固定の記憶方式に基づいて実現される.ここではまずインタフェースを定義し、インタフェースに基づいて実現します.コードを見てください.
package simple;
interface queue {
boolean isEmpty();
void in(Object value);
Object top();
void out();
boolean isFull();
int getSize();
}
public class ArrayBase implements queue {
private static final int MAXSIZE = 100;
int front;
int rear;
int number;
Object[] data;
ArrayBase() {
front = rear = -1;
number = 0;
data = new Object[MAXSIZE];
}
@Override
public void in(Object value) {
// TODO Auto-generated method stub
if (this.isFull()) {
System.out.println("Sorry, the queue is full!");
} else {
this.rear = (this.rear + 1) % MAXSIZE;
number++;
this.data[this.rear] = value;
}
}
@Override
public Object top() {
// TODO Auto-generated method stub
if (this.isEmpty()) {
System.out.println("Sorry, the queue is empty!");
}
int p = (this.front + 1) % MAXSIZE;
return data[p];
}
@Override
public void out() {
// TODO Auto-generated method stub
if (this.isEmpty()) {
System.out.println("Sorry, the queue is empty!");
}
this.front = (this.front - 1) % MAXSIZE;
number--;
}
@Override
public boolean isFull() {
// TODO Auto-generated method stub
if (this.rear == MAXSIZE - 1) {
return true;
}
return false;
}
public boolean isEmpty() {
if (number == 0) {
return true;
}
return false;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return this.number;
}
}
次はテストクラスです.
package simple;
public class MyQueueTest {
public static void main(String []args){
ArrayBase myQueue=new ArrayBase();
System.out.println(((ArrayBase) myQueue).isEmpty());
myQueue.in(false);
myQueue.in(1);
myQueue.in('T');
myQueue.in("Biao");
System.out.println("Now there are "+myQueue.getSize()+" items!");
System.out.println("Top Item is: "+ myQueue.top());
myQueue.out();
System.out.println("After the out operation,there are "
+myQueue.getSize()+" items in this queue!");
}
}
テストの結果です
true
Now there are 4 items!
Top Item is: false
After the out operation,there are 3 items in this queue!
2、もちろん非線形のストレージ構造を用いてキューを実現することも可能であり、利点は「偽オーバーフロー」現象を回避し、空間に十分に利用できることである.コード実装は次のとおりです.
package simple;
interface queueListBase {
boolean isEmpty();
void in(Object value);
Object top();
Object out();
int getSize();
}
class Node{
Object data;
Node next;
Node(){
data=null;
next=null;
}
}
public class ListBase implements queueListBase{
int number;
Node front;
Node rear;
public ListBase(){
number=0;
front=rear=null;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
if(this.front==this.rear){
return true;
}
return false;
}
/* * (non-Javadoc) * front , NullPointerException ! * @see simple.queueListBase#in(java.lang.Object) */
@Override
public void in(Object value) {
// TODO Auto-generated method stub
if (rear == null && front == null) {
rear = new Node();
rear.data=value;
front = rear;
} else {
Node node = new Node();
node.data=value;
rear.next = node;
rear = node;
number++;
}
}
@Override
public Object top() {
// TODO Auto-generated method stub
Node temp=new Node();
temp.data=this.front.data;
return temp;
}
@Override
public Object out() {
// TODO Auto-generated method stub
Object temp=null;
if(this.isEmpty()){
System.out.println("Sorry,the queue is Empty!");
return false;
}else{
temp=this.front.data;
this.front=this.front.next;
if(front.next==null){
this.rear=this.front;
}
number--;
}
return temp;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return number;
}
}
次は私のテストコードです.
package simple;
public class MyQueueTest {
public static void main(String []args){
// ArrayBase myQueue=new ArrayBase();
ListBase myQueue=new ListBase();
System.out.println(((ListBase) myQueue).isEmpty());
myQueue.in(false);
myQueue.in(1);
myQueue.in('T');
myQueue.in("Biao");
System.out.println(myQueue.out());
System.out.println(myQueue.out());
System.out.println(myQueue.out());
System.out.println(myQueue.out());
System.out.println("Now there are "+myQueue.getSize()+" items!");
System.out.println("Top Item is: "+ myQueue.top());
myQueue.out();
System.out.println("After the out operation,there are "
+myQueue.getSize()+" items in this queue!");
}
}
テストの結果は次のとおりです.
true
false
1
T
Sorry,the queue is Empty!
false
Now there are 0 items!
Top Item is: simple.Node@659e0bfd
Sorry,the queue is Empty!
After the out operation,there are 0 items in this queue!
結果分析:チェーンキューに値が格納されている場合、文字列タイプは正常に格納されていないことがわかります.しかし、これはキューが文字列タイプのデータを格納できないわけではないので、注意してください.そうでなければ、今後のソフトウェアのエラーを引き起こす可能性があります.次はもっと完全な非線形のキューの実現コードで、私が入隊して操作に失敗した後に修正されたブログでもあります.あなたと一緒に勉強して、一緒に進歩しましょう.非線形キューの実装