ホームページ よくある問題 プログラマ、知っておくべきデータ構造スタック

プログラマ、知っておくべきデータ構造スタック

Aug 23, 2019 pm 05:01 PM
データ構造 スタック

プログラマ、知っておくべきデータ構造スタック

データ構造内のスタックを Java のスタックと混同しないでください。これらは同じものではありません。データ構造内のスタックは、制限された線形リストです。スタックには次のものがあります。スタックは最後のデータ項目、つまり最後に挿入されたデータ項目へのアクセスのみを許可するため、高度な Out、後入れ先出しの特性。スタックには多くの制限があるため、なぜスタックの代わりに配列またはリンク リストを使用しないのかという疑問があるかもしれません。開発では、特定のシナリオがあり、特定のシナリオに従ってデータ構造を選択します。スタックには、ブラウザの前後方向、文字列括弧の正当性など、適用可能なシナリオが多数あります。スタックを使用する方が良いでしょう。スタックが提供する外部インターフェイスの数が配列やリンク リストよりもはるかに少ないため、 を実装すると、インターフェイスの数が少なくなり、エラーの可能性が減り、リスクの制御性が向上します。

推奨チュートリアル: PHP ビデオ チュートリアル

実装してみようスタック

スタックの定義からわかるように、スタックには主に 2 つの操作があります。1 つはデータの追加 (プッシュと呼ばれます) で、もう 1 つはデータの追加です。次の 2 つの図は、スタックのプッシュとポップの概略図です。

プログラマ、知っておくべきデータ構造スタック

プログラマ、知っておくべきデータ構造スタック

スタックを実装するには 2 つの方法があります。1 つは配列の実装に基づくもので、これをシーケンシャル スタックと呼びます。もう 1 つはリンクされたリストに基づいて実装されるため、これをリンク スタックと呼びます。以下は 2 つのスタックの実装コードです。

配列ベースのシーケンシャル スタック

/**
 * 基于数组的顺序栈
 */
 public class ArrayStack {    // 栈最大容量
    private int maxSzie;    // 存放内容
    private String[] array;    // 栈顶元素
    private int top;    
    public ArrayStack(int size){      
      this.maxSzie = size;        
      this.array = new String[this.maxSzie];        
      this.top = 0;
    }  
      /**
     * 入栈操作
     *
     * @param data 数据
     * @return 0:入栈失败 1:入栈成功
     */
    public int push(String data) {      
      if (top == maxSzie) return 0;
        array[top] = data;
        top++;        
        return 1;
    }    
    /**
     * 出栈操作
     *
     * @return
     */
    public String pop() {     
       if (top == 0) return null;        
       return array[--top];
    }    
    /**
     * 获取栈顶元素
     *
     * @return
     */
    public String peek() {     
       return array[top - 1];
    }    
    /**
     * 判断栈是否为空
     * @return
     */
    public boolean isEmpty() {    
        return top == 0;
    }
}
ログイン後にコピー

リンク リストに基づくリンク スタック

/**
 * 基于链表的链式栈
 */public class LinkStack {    // 始终指向栈的第一个元素
    private Node top = null;    
    /**
     * 压栈
     *
     * @param data
     * @return
     */
    public int push(String data) {
        Node node = new Node(data);        
        if (top == null) {
            top = node;
        } else {
            node.next = top;
            top = node;
        }       
         return 1;
        }   
     /**
     * 出栈
     *
     * @return
     */
    public String pop() {     
       if (top == null) return null;
        String data = top.getData();
        top = top.next;       
         return data;
    }   
     /**
     * 节点信息
     */
    private static class Node {      
      private String data;      
      private Node next;        
      public Node(String data) {        
          this.data = data;          
          this.next = null;
        }       
      public String getData() {          
        return this.data;
        }
    }
}
ログイン後にコピー

スタックに関与する操作はそれほど多くなく、主にプッシュとポップの 2 つの操作であるため、スタックの実装は比較的単純です。

#スタックの適用

文字列括弧の正当性の検出

場合によっては、文字列括弧の正当性、つまり、左括弧が右括弧と一致する必要があるかどうかを検出する必要があることがあります。スタックを使用してこれを実現できます。なぜスタックが合法的な括弧から使用されるのか理解できますか?括弧が合法的に使用されている場合、最後の左括弧は最初の右括弧と一致し、最後から 2 番目の左括弧は 2 番目の右括弧と一致し、以下同様になります。これは、スタックの先入れ後出し機能と一致しています。

丸括弧 ()、角括弧 []、中括弧 {} の 3 種類の括弧があるとします。スタックを使用して括弧の有効性をチェックします。すべての左括弧をスタックにプッシュし、右括弧が現れたら照合を実行します。このとき、次の 3 つの状況があります。括弧の使用は不正です

●スタックから取り出した左括弧は右括弧と一致せず、括弧の使用は不正です

●スタックから取り出した左括弧は右括弧と一致し、括弧の使用は一時的に有効です

When 文字列全体がスキャンされた後、スタックにまだ値があるかどうかを確認します。スタックが空の場合は、いずれにせよ、括弧の使用は違法です。

実装コード

public static boolean BracketChecker(String data) {
    char[] chars = data.toCharArray();
    ArrayStack stack = new ArrayStack(chars.length);    
    for (char ch : chars) {
            switch (ch){
                        case '{':            
                        case '[':            
                        case '(':
                                stack.push(ch);                
                                break;            
                         case '}':            
                         case ']':            
                         case ')':             
                                if (!stack.isEmpty()){                 
                                   char ch1 = stack.pop();                    
                                   if ((ch=='}' && ch1 !='{')
                                        ||(ch==']' && ch1 !='[')
                                        ||(ch==')' && ch1 !='(')

                    ){                 
                           return false;
                    }
                }else {    
                           return false;
                }     
                break;            
        default:            
            break;
        }
    }   
    return stack.isEmpty();
}
ログイン後にコピー
ブラウザの進む関数と戻る関数

私たちは皆、ブラウザを使用しています。 、ブラウザは前後に移動でき、ブラウザの進む機能と戻る機能もスタックの特性と一致しています。最初にアクセスした Web ページは、最後に戻る必要があります。スタックがこの関数をどのように実装しているかを見てみましょう。

2 つのスタックを定義する必要があります。初めて訪問したページを最初のスタックにプッシュします。戻るをクリックすると、最初のスタックからデータを取得して 2 番目のスタックに置きます。 「進む」ボタンをクリックすると、データが 2 番目のスタックから取得され、最初のスタックに配置されます。最初のスタックにデータがない場合は、戻るためにクリックするページがないことを意味し、2 番目のスタックにデータがない場合は、クリックして進むページがないことを意味します。このようにして、スタックを介してブラウザの進む機能と戻る機能を実装します。

以上がプログラマ、知っておくべきデータ構造スタックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Java 関数比較を使用して複雑なデータ構造を比較する Java 関数比較を使用して複雑なデータ構造を比較する Apr 19, 2024 pm 10:24 PM

Java で複雑なデータ構造を使用する場合、Comparator を使用して柔軟な比較メカニズムを提供します。具体的な手順には、コンパレータ クラスの定義、比較ロジックを定義するための比較メソッドの書き換えが含まれます。コンパレータインスタンスを作成します。 Collections.sort メソッドを使用して、コレクションとコンパレータのインスタンスを渡します。

Javaのデータ構造とアルゴリズム: 詳細な説明 Javaのデータ構造とアルゴリズム: 詳細な説明 May 08, 2024 pm 10:12 PM

データ構造とアルゴリズムは Java 開発の基礎です。この記事では、Java の主要なデータ構造 (配列、リンク リスト、ツリーなど) とアルゴリズム (並べ替え、検索、グラフ アルゴリズムなど) について詳しく説明します。これらの構造は、スコアを保存するための配列、買い物リストを管理するためのリンク リスト、再帰を実装するためのスタック、スレッドを同期するためのキュー、高速検索と認証のためのツリーとハッシュ テーブルの使用など、実際の例を通じて説明されています。これらの概念を理解すると、効率的で保守しやすい Java コードを作成できるようになります。

Go 言語の参照型についての深い理解 Go 言語の参照型についての深い理解 Feb 21, 2024 pm 11:36 PM

参照型は Go 言語の特別なデータ型であり、その値にはデータそのものが直接格納されるのではなく、格納されたデータのアドレスが格納されます。 Go 言語では、参照型にはスライス、マップ、チャネル、ポインターが含まれます。 Go 言語のメモリ管理とデータ転送方法を理解するには、参照型を深く理解することが重要です。この記事では具体的なコード例を組み合わせて、Go言語における参照型の特徴と使い方を紹介します。 1. スライス スライスは、Go 言語で最も一般的に使用される参照型の 1 つです。

PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 Jun 03, 2024 am 09:58 AM

AVL ツリーは、高速かつ効率的なデータ操作を保証するバランスのとれた二分探索ツリーです。バランスを達成するために、左回転と右回転の操作を実行し、バランスに反するサブツリーを調整します。 AVL ツリーは高さバランシングを利用して、ツリーの高さがノード数に対して常に小さくなるようにすることで、対数時間計算量 (O(logn)) の検索操作を実現し、大規模なデータ セットでもデータ構造の効率を維持します。

Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Feb 23, 2024 am 10:49 AM

Java コレクション フレームワークの概要 Java コレクション フレームワークは Java プログラミング言語の重要な部分であり、データを保存および管理できる一連のコンテナ クラス ライブラリを提供します。これらのコンテナ クラス ライブラリには、さまざまなシナリオでのデータ ストレージと処理のニーズを満たすために、さまざまなデータ構造があります。コレクション フレームワークの利点は、統一されたインターフェイスが提供され、開発者が異なるコンテナ クラス ライブラリを同じ方法で操作できるため、開発の困難さが軽減されることです。 Java コレクション フレームワークのデータ構造 Java コレクション フレームワークにはさまざまなデータ構造が含まれており、それぞれに独自の特性と適用可能なシナリオがあります。以下に、一般的な Java コレクション フレームワークのデータ構造をいくつか示します。 1. リスト: リストは、要素を繰り返すことができる順序付けされたコレクションです。李

Go 言語のデータ構造の秘密を詳しく学ぶ Go 言語のデータ構造の秘密を詳しく学ぶ Mar 29, 2024 pm 12:42 PM

Go 言語のデータ構造の謎を深く研究するには、具体的なコード例が必要ですが、簡潔で効率的なプログラミング言語である Go 言語は、データ構造の処理においても独特の魅力を発揮します。データ構造はコンピューター サイエンスの基本概念であり、より効率的にアクセスして操作できるようにデータを整理および管理することを目的としています。 Go 言語のデータ構造の謎を深く学ぶことで、データがどのように保存され操作されるかをより深く理解できるようになり、それによってプログラミングの効率とコードの品質が向上します。 1. 配列 配列は最も単純なデータ構造の 1 つです

PHP SPL データ構造: プロジェクトにスピードと柔軟性をもたらします PHP SPL データ構造: プロジェクトにスピードと柔軟性をもたらします Feb 19, 2024 pm 11:00 PM

PHPSPL データ構造ライブラリの概要 PHPSPL (標準 PHP ライブラリ) データ構造ライブラリには、さまざまなデータ構造を保存および操作するためのクラスとインターフェイスのセットが含まれています。これらのデータ構造には、配列、リンク リスト、スタック、キュー、セットが含まれており、それぞれがデータを操作するためのメソッドとプロパティの特定のセットを提供します。配列 PHP では、配列は一連の要素を格納する順序付けされたコレクションです。 SPL 配列クラスは、ソート、フィルタリング、マッピングなどのネイティブ PHP 配列の拡張機能を提供します。 SPL 配列クラスの使用例を次に示します。 useSplArrayObject;$array=newArrayObject(["foo","bar","baz"]);$array

ハッシュ テーブル ベースのデータ構造により、PHP 配列の論理積と和集合の計算が最適化されます。 ハッシュ テーブル ベースのデータ構造により、PHP 配列の論理積と和集合の計算が最適化されます。 May 02, 2024 pm 12:06 PM

ハッシュ テーブルを使用すると、PHP 配列の交差と和集合の計算を最適化し、時間の複雑さを O(n*m) から O(n+m) に減らすことができます。 具体的な手順は次のとおりです。 ハッシュ テーブルを使用して要素をマップします。最初の配列をブール値に変換すると、2 番目の配列の要素が存在するかどうかがすぐにわかり、交差計算の効率が向上します。ハッシュ テーブルを使用して最初の配列の要素を既存としてマークし、次に 2 番目の配列の要素を 1 つずつ追加し、既存の要素を無視して共用体計算の効率を向上させます。