データ構造_2:スタック

スタック

最初に書く

  • 線形構造、スタック操作は配列操作のサブセットです
  • 後入れ先出しデータ構造(LIFO)では、要素は一方の端からのみ追加でき、要素は一方の端からのみ取り出すことができます。この端はスタックの最上位と呼ばれます。

スタックの実現:動的配列の多重化、およびインターフェースによるArrayStack <E>の構築

  • スタックインターフェース:

      public interface Stack<E> {
      
          /**
           * 获取栈内元素容量
           * @return
           */
          int getSize();
      
          /**
           * 栈空判断
           * @return
           */
          boolean isEmpty();
      
          /**
           * 入栈
           * @param e
           */
          void push(E e);
      
          /**
           * 出栈
           * @return
           */
          E pop();
      
          /**
           * 获取栈顶元素
           * @return
           */
          E peek();
      }
    
  • インターフェイス実装クラス:ArrayStack <E>

      public class ArrayStack<E> implements Stack<E> {
    
          private Array<E> array;
      
          public ArrayStack(int capacity) {
              array = new Array<>(capacity);
          }
      
          public ArrayStack() {
              array = new Array<>();
          }
      
          public int getCapacity() {
              return array.getCapacity();
          }
      
          @Override
          public int getSize() {
              return array.getSize();
          }
      
          @Override
          public boolean isEmpty() {
              return array.isEmpty();
          }
      
          @Override
          public void push(E e) {
              array.addLast(e);
          }
      
          @Override
          public E pop() {
      		// 等同于:array.remove(size - 1);
              return array.removeLast();
          }
      
          @Override
          public E peek() {
      		// 等同于:array.get(size - 1);
              return array.getLast();
          }
      
          @Override
          public String toString() {
              return "stack.ArrayStack{" +
                      "array=" + array +
                      '}';
          }
      }
    

応用

  • エディタ-元に戻す(元に戻す)操作:元に戻す操作は、常に現在のステップの前の操作を元に戻し、スタック操作は操作スタックから順番に実行されます。
  • オペレーティングシステム-システムコールスタック:プログラムのネストされた命令実行の割り込みポイントを記録し、割り込みポイントレコードをスタックにプッシュします(類似のサブ関数実行ポイント、最下位のサブ関数までスタック操作にサブ関数実行ポイントを繰り返します。関数が呼び出されます)、ポップ操作は、一番下の割り込みポイントの結果を順番に返す操作です。
  • 編集者-ブラケットのマッチング、例としてLikou-T20を取り上げます。
    • 質問:

        给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
        有效字符串需满足:
        	左括号必须用相同类型的右括号闭合。
        	左括号必须以正确的顺序闭合。
        注意空字符串可被认为是有效字符串。
      
    • 溶液:スタックの使用特性、与えられた文字列走査要素は、左括弧文字の種類(([{ )、非左括弧文字クラスのスタック操作を行う:ペアリングを横断する、決定するために、上部要素ペアリングロジックを取ることは成功した後であります最後に、一致が成功するとスタックは空になります。

        import java.util.Stack;
        class Solution {
            public boolean isValid(String s) {
                Stack<Character> stack = new Stack<>();
                for (int i = 0; i < s.length(); i ++) {
                    char c = s.charAt(i);
                    if (c == '(' || c =='[' || c == '{') {
                        stack.push(c);
                    } else {
                        if (stack.isEmpty()) {
                            return false;
                        }
                        if (c == ')' && stack.pop() != '(') {
                            return false;
                        }
                        if (c == ']' && stack.pop() != '[') {
                            return false;
                        }
                        if (c == '}' && stack.pop() != '{') {
                            return false;
                        }
                    }
                }
                return stack.isEmpty();
            }
        }
      

おすすめ

転載: blog.csdn.net/Nerver_77/article/details/89786542