ホームページ > バックエンド開発 > PHPの問題 > キューを実装する方法は何通りありますか?

キューを実装する方法は何通りありますか?

coldplay.xixi
リリース: 2023-03-01 17:22:01
オリジナル
4787 人が閲覧しました

キューを実装するには 3 つの方法があります: 1. リンク リストに基づいてキューを実装する; 2. linkedList を使用してキューを実装する; 3. 2 つのスタックを使用してキューを実装する。

キューを実装する方法は何通りありますか?

キューを実装するには 3 つの方法があります。実装方法は次のとおりです:

1. 実装ベースリンクされたリストのキュー:

まず、ノード要素としてノード クラスをキューに追加します

public class Node {//链表中的一个节点
Node next = null;
int data;
//构造函数,用于添加链表时候使用
public Node(int d) {
this.data = d;
};
}
ログイン後にコピー

次に、新しいクラスをキューとして作成し、キュー エントリを実装して終了します。このクラス チームの長さと判定、キューのキューが空である ノード Node を追加し、enqueue メソッドでキューが空かどうかを判定する キューが空 (head==tail) の場合、ノードキューに追加されるのは、キューの先頭と末尾の両方です。キューが空でない場合は、末尾ノードの次のポインタが要素を指し、次に末尾ノードがそのノードを指します。

public void put(Integer data) {
Node newNode = new Node(data);//构造一个新节点
if(head == null && tail == null) {//队列为空
head = newNode;
tail = newNode;
}else {
tail.next = newNode;
tail = newNode;
}
}
ログイン後にコピー

② デキュー操作:

キューが空の場合は、空を返します。キューが空でない場合は、キューの先頭ノードを返し、その先頭ノードの次の要素を先頭ノードとして再利用します。

public Integer pop() {
if(this.isEmpty()) {
return null;
}
int data = head.data;
head = head.next;
return data;
}
ログイン後にコピー

③ 空のキューと空のキューの判断は非常に簡単です。キューの長さを変更するには、コードを直接貼り付けるだけです。それ以上は必要ありません。

public int size() {
int count = 0;
Node tmp = head;
while(tmp != null) {
count++;
tmp = tmp.next;
}
return count;
}
ログイン後にコピー

④詳細なコード実装:

package com.wp.datastruct;
 
/**
 * 利用链表来实现队列
 * */
public class MyQueue {
Node head = null;//队列头
Node tail = null;//队列尾
/**
* 入队操作:
* 若该队列尾空,则入队节点既是头结点也是尾节点
* 若队列不为空,则先用tail节点的next指针指向该节点
* 然后将tail节点指向该节点
* */
public void put(Integer data) {
Node newNode = new Node(data);//构造一个新节点
if(head == null && tail == null) {//队列为空
head = newNode;
tail = newNode;
}else {
tail.next = newNode;
tail = newNode;
}
}
/**
* 判断队列是否为空:当头结点等于尾节点的时候该队列就为空
* */
public boolean isEmpty() {
return head == tail;
}
/**
* 出队操作:
* 若队列为空,则返回null
* 否则,返回队列的头结点,并将head节点指向下一个
* */
public Integer pop() {
if(this.isEmpty()) {
return null;
}
int data = head.data;
head = head.next;
return data;
}
public int size() {
int count = 0;
Node tmp = head;
while(tmp != null) {
count++;
tmp = tmp.next;
}
return count;
}
 
}
ログイン後にコピー

2.

linkedList

を使用してキューを実装します

このメソッドは Java で使用されますlinkedList コレクションを使用してキューを実装し、linkedList 内のメソッドを呼び出してキューの出入り、空の判定、その他の操作を実装します。最初に、2 つの属性を含む新しいクラスをキューとして作成します。 1 つはサイズです。キューの長さをカウントするために使用され、もう 1 つは LinkedList オブジェクトです。

はキューを表します。

private LinkedList<E> list = new LinkedList<>();
private int size = 0;//用于统计队列的长度
ログイン後にコピー

① キュー操作:

追加操作と削除操作が linkedList コレクションに実装されているはずです。ここでは、キュー関連の操作を実装するメソッドを呼び出すだけです。 、非常にシンプルで理解しやすいです。

public synchronized void put(E data) {//保证线程安全,实现同步操作
list.add(data);
size++;
}
ログイン後にコピー

② デキュー操作:

public synchronized E pop() {
size--;
return list.removeFirst();//从头取出
}
ログイン後にコピー

③ 詳細コード:

public class MyQueue2 {
private LinkedList<E> list = new LinkedList<>();
private int size = 0;//用于统计队列的长度
public synchronized void put(E data) {//保证线程安全,实现同步操作
list.add(data);
size++;
}
public synchronized E pop() {
size--;
return list.removeFirst();//从头取出
}
public synchronized int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
}
ログイン後にコピー

3. 2 つのスタックを使用してキューを実装します。

実装された 2 つのスタックを使用してキューを実装することもできます (この質問は書面面接で尋ねられる場合があります)。 実装方法は次のとおりです。

2 つのスタック s1 と s2 を作成します。キューに参加するときは、スタックの s1 にプッシュされるだけです。

デキューには 2 つのケースがあります。 1. s2 が空でない場合、スタックの最上位要素がデキュー要素としてポップされます。

2. S2 が空の場合、まず S1 の要素を S2 にポップし、次に S2 の最上位の要素をチームの要素としてポップアップします。

① チームへの参加:

public synchronized void put(E data) {//使用同步处理,保证线程安全
s1.push(data);
}
ログイン後にコピー

② チームからの離脱:

public synchronized E pop() {
if(!s2.isEmpty()) {
return s2.pop();
}else {
s2.push(s1.pop());
return s2.pop();
}
}
ログイン後にコピー

③. 詳細なコード実装:

package com.wp.datastruct;
 
import java.util.Stack;
 
/**
 * 利用两个栈来模拟队列操作
 * 入队操作就只是想栈s1中添加,
 * 出栈操作分为两部分:
 * 1.当s2中不为空的时候,就直接弹出s2中的栈顶数据
 * 2.当s2中为空的时候,就先把s1中的数据全部弹出到s2中然后将栈顶数据出栈
 * 
 * */
public class MyQueue3<E> {
Stack<E> s1 = new Stack<>();
Stack<E> s2 = new Stack<>();
public synchronized void put(E data) {//使用同步处理,保证线程安全
s1.push(data);
}
public synchronized E pop() {
if(!s2.isEmpty()) {
return s2.pop();
}else {
s2.push(s1.pop());
return s2.pop();
}
}
public synchronized boolean isEmpty() {
return s1.isEmpty() && s2.empty();
}
}
ログイン後にコピー

推奨チュートリアル: "

php ビデオ チュートリアル

"

以上がキューを実装する方法は何通りありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート