Go 言語にはキュー構造とスタック構造がありますか?
Go 言語にはキューとスタックに関連するデータ構造はありませんが、スライスを使用してスタックとキューの操作を実装できます。 Go 言語は、主にアペンドとスライス (組み込みの配列型で操作) を使用してスタックとキューを実装します。スタックとキューを作成するための構文は "make([]int, 0)" で、スタックとキューにプッシュするための構文は次のとおりです。 「append(stack, 10)」、スタックをポップする構文は「v:=stack[len(stack)-1] stack = stack[:len(stack)-1]」です。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語にはスタックとキューに関連するデータ構造はありませんが、slices を使用してスタックとキューの操作を実装できます。次に、スタックとキューを実装します。基本操作 を一緒に実装し、スタックを使用してキュー を実装する 、キューを使用してスタック 操作を実装する も実装します。
スタックとキューの基本操作の実装
1. スタックの基本操作
実装には主に Go 言語が使用されますスタックとキューの追加とスライス (組み込みの配列型で操作)
//创建栈 stack := make([]int, 0) //push压入栈 stack = append(stack, 10) //pop弹出 v := stack[len(stack)-1] stack = stack[:len(stack)-1] //检查栈空 len(stack) == 0
2. 基本的なキュー操作
//创建队列 queue := make([]int, 0) //enqueue入队 queue = append(queue, 10) //dequeue出队 v := queue[0] queue = queue[1:] //检查队列为空 len(queue) == 0
スタックを使用してキューを実装する
1. 理論
##スタックを使用してキューの動作をモデル化します。スタックを 1 つだけ使用すると確実に機能しないため、スタックが 2 つ必要ですスタックは、入力スタックと出力スタックが 1 つずつあり、ここでは入力スタックと出力スタックの関係に注目してください。 以下のアニメーションは、次のキューの実行プロセスを次のようにシミュレートします。 実行ステートメント:queue.push(1); queue.push(2); queue.pop(); 注意此时的输出栈的操作 queue.push(3); queue.push(4); queue.pop(); queue.pop();注意此时的输出栈的操作 queue.pop(); queue.empty();
2. アルゴリズムの質問
元の LeetCode の質問を見てみましょう先入れ先出しキューを実装するには、スタックを 2 つだけ使用してください。キューは、一般的なキューでサポートされるすべての操作 (プッシュ、ポップ、ピーク、空) をサポートする必要があります: MyQueue クラスを実装します: void Push(int x) 要素 x を末尾にプッシュします。待ち行列 int Pop() はキューの先頭から要素を削除して返します。 int Peak() はキューの先頭にある要素を返します。 boolean empty() は、キューが空の場合は true を返し、そうでない場合は false を返します。 注: 標準のスタック操作のみを使用できます。つまり、先頭へのプッシュ、先頭からのピーク/ポップ、サイズ、および空の操作のみが有効です。 使用している言語はスタックをサポートしていない可能性があります。標準のスタック操作である限り、リストまたはデキュー (両端キュー) を使用してスタックをシミュレートできます。3. アイデア
この問題を解決するには、出力スタックと入力スタックが必要ですまず、データを入力スタックに置きます。入力スタックからのデータを出力スタックに配置します このとき、出力スタックからの出力データの順序はキューの順序と同じです 先入れ先出し#4. コード部分type MyQueue struct {
stackIn []int // 用来保存Push数据
stackOut []int // 用来保存Pop数据
}
// 栈构造器
func Constructor() MyQueue {
return MyQueue{
stackIn: make([]int, 0),
stackOut: make([]int, 0),
}
}
func (this *MyQueue) Push(x int) {
// 判断stackOut中是否有元素,有的话全部放到stackIn
for len(this.stackOut) != 0 {
val := this.stackOut[len(this.stackOut)-1]
this.stackOut = this.stackOut[:len(this.stackOut)-1]
this.stackIn = append(this.stackIn, val)
}
// 将数据加进stackIn
this.stackIn = append(this.stackIn, x)
}
func (this *MyQueue) Pop() int {
// 判断stackIn中是否有元素,有的话全部放到stackOut
for len(this.stackIn) != 0 {
val := this.stackIn[len(this.stackIn)-1]
this.stackIn = this.stackIn[:len(this.stackIn)-1]
this.stackOut = append(this.stackOut, val)
}
// stackOut为零,说明没有元素,return 0
if len(this.stackOut) == 0 {
return 0
}
// stackOut Pop 元素
res := this.stackOut[len(this.stackOut)-1]
this.stackOut = this.stackOut[:len(this.stackOut)-1]
return res
}
func (this *MyQueue) Peek() int {
// 调用Pop()方法
val := this.Pop()
// val为零,说明没有元素,return 0
if val == 0 {
return 0
}
// Pop()方法删除了val,这里加上
this.stackOut = append(this.stackOut, val)
return val
}
func (this *MyQueue) Empty() bool {
// 两个栈都为空,说明为空,否则不为空
return len(this.stackOut) == 0 && len(this.stackIn) == 0
}
ログイン後にコピーコードは直接バックルに取り付けて実行できます。コメントで詳細を説明しましたが、理解できない場合は、ブロガーにプライベートメッセージを送信できます。
キューを使用してスタックを実装するtype MyQueue struct { stackIn []int // 用来保存Push数据 stackOut []int // 用来保存Pop数据 } // 栈构造器 func Constructor() MyQueue { return MyQueue{ stackIn: make([]int, 0), stackOut: make([]int, 0), } } func (this *MyQueue) Push(x int) { // 判断stackOut中是否有元素,有的话全部放到stackIn for len(this.stackOut) != 0 { val := this.stackOut[len(this.stackOut)-1] this.stackOut = this.stackOut[:len(this.stackOut)-1] this.stackIn = append(this.stackIn, val) } // 将数据加进stackIn this.stackIn = append(this.stackIn, x) } func (this *MyQueue) Pop() int { // 判断stackIn中是否有元素,有的话全部放到stackOut for len(this.stackIn) != 0 { val := this.stackIn[len(this.stackIn)-1] this.stackIn = this.stackIn[:len(this.stackIn)-1] this.stackOut = append(this.stackOut, val) } // stackOut为零,说明没有元素,return 0 if len(this.stackOut) == 0 { return 0 } // stackOut Pop 元素 res := this.stackOut[len(this.stackOut)-1] this.stackOut = this.stackOut[:len(this.stackOut)-1] return res } func (this *MyQueue) Peek() int { // 调用Pop()方法 val := this.Pop() // val为零,说明没有元素,return 0 if val == 0 { return 0 } // Pop()方法删除了val,这里加上 this.stackOut = append(this.stackOut, val) return val } func (this *MyQueue) Empty() bool { // 两个栈都为空,说明为空,否则不为空 return len(this.stackOut) == 0 && len(this.stackIn) == 0 }
1.理論
キューはスタックをシミュレートします。実際には 1 つのキューで十分です。それではまず、2 つのキューを使用してスタックを実装するというアイデアについて話しましょう。
キューは先入れ先出しルールです。あるキュー内のデータが別のキューにインポートされても、データの順序は変更されず、先入れ後出しにもなりません。 -アウトオーダー。
したがって、スタックを使用してキューを実装するという考え方は、2 つのデータ構造の性質に応じて、キューを使用してスタックを実装することとは異なります。
しかし、スタックをシミュレートするには 2 つのキューを使用する必要がありますが、入力と出力の間には関係がなく、別のキューが完全にバックアップに使用されます。
下のアニメーションに示すように、キュー関数の実装には que1 と que2 の 2 つのキューが使用されます。que2 は実際にはバックアップ関数です。que1 の最後の要素を除くすべての要素を que2 にバックアップし、ポップします。サーフェスの最後の要素まで移動し、他の要素を que2 から que1 に戻します。
シミュレートされたキュー実行ステートメントは次のとおりです:
queue.push(1); queue.push(2); queue.pop(); // 注意弹出的操作 queue.push(3); queue.push(4); queue.pop(); // 注意弹出的操作 queue.pop(); queue.pop(); queue.empty();
問題を考えてみましょう。 LeetCode の元の質問
225 を参照してください。キューを使用してスタックを実装します
ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GOプログラミングのリソース管理:MySQLとRedisは、特にデータベースとキャッシュを使用して、リソースを正しく管理する方法を学習するために接続およびリリースします...

VSCODEユーザーのGolang Generic Function Typeの制約の自動削除は、VSCODEを使用してGolangコードを書くときに奇妙な問題に遭遇する可能性があります。いつ...

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

マルチプロセスのログライティングの並行性セキュリティの問題を効率的に処理します。複数のプロセスが同じログファイルを同時に書き込みます。並行性が安全で効率的であることを確認する方法は?これは...

GOを使用してOracleデータベースに接続するときにOracleクライアントをインストールする必要がありますか? GOで開発するとき、Oracleデータベースに接続することは一般的な要件です...
