国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結構-棧

TalkingData / 1207人閱讀

摘要:棧也稱為后進先出表棧的應用場景操作撤銷例如將操作的每組數(shù)據(jù)存入棧中,如果想要撤銷,只需要彈出棧頂元素,就可以恢復上一步操作了。最后執(zhí)行完成,根據(jù)棧的結構開始彈出數(shù)據(jù),一步一步再走回方法。

數(shù)據(jù)結構-棧
定義

棧(英語:stack)又稱為堆棧或堆疊,棧作為一種數(shù)據(jù)結構,它按照先進后出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時候從棧頂開始彈出數(shù)據(jù)(最后一個數(shù)據(jù)被第一個讀出來)。
  由于堆疊數(shù)據(jù)結構只允許在一端進行操作,因而按照后進先出(LIFO, Last In First Out)的原理運作。棧也稱為后進先出表

棧的應用場景 undo操作(撤銷)

例如:將操作的每組數(shù)據(jù)存入棧中,如果想要撤銷,只需要彈出棧頂元素,就可以恢復上一步操作了。

程序調(diào)用的系統(tǒng)棧

例如:A方法調(diào)用B方法得到返回值,B調(diào)用C得到返回值,A操作走到了B方法,這個時候可以將A的代碼位置存儲到棧中,然后走到B方法,B操作走到了C方法,這個時候可以將B的代碼位置存儲到棧中。最后C執(zhí)行完成,根據(jù)棧的結構開始彈出數(shù)據(jù),一步一步再走回A方法。

判斷括號是否有效。下文會有代碼實現(xiàn)(詳細規(guī)則描述可以參考leetcode第20題)

開括號必須用同一類型的括號閉合。

開方括號必須按正確順序閉合。

例如:正確的:{[()]} [{()}] ({[]}) 等 。錯誤的:[{(})] [}{()] 等。

自定義棧基類的代碼實現(xiàn)

棧在java.util有一個工具類,先不用,自定義實現(xiàn)一個

創(chuàng)建一個接口,用來統(tǒng)一規(guī)范所有棧實現(xiàn)
package com.datastructure.stack;

public interface Stack {

    /**
     * 向棧插入元素
     * @param e
     */
    public  void push(E e);


    /**
     * 取出最上面的元素,并且返回
     * @return
     */
    public E pop();

    /**
     * 獲取棧的大小
     * @return
     */
    public int getSize();

    /**
     * 判斷棧是否為空
     * @return
     */
    public boolean isEmpty();

    /**
     * 獲取棧最上面的元素
     * @return
     */
    public E peek();
}
用基于數(shù)組的方式來實現(xiàn)一個棧(上文所寫的自定義數(shù)組)
package com.datastructure.stack;

import com.datastructure.array.Array;

/**
 * @program: test
 * @description:
 * @author: Mr.Yang
 * @create: 2019-05-02 15:27
 **/
public class ArrayStack implements Stack{

    Array array;

    public ArrayStack(int capacity){
        array=new Array(capacity);
    }



    public ArrayStack(){
        array=new Array();
    }

    @Override
    public void push(E e) {
        array.addLast(e);
    }

    @Override
    public E pop() {
        return array.removeLast();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }


    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }


    @Override
    public E peek() {
        return array.getLast();
    }

    /**
     * 獲取容量值
     * @return
     */
    public int getCapacity(){
        return array.getCapacity();
    }


    @Override
    public String toString(){
        StringBuffer sb = new StringBuffer();
        sb.append("stack: ");
        sb.append("[");
        for(int i=0;i
測試代碼
package com.datastructure.stack;

/**
 * @program: test
 * @description:
 * @author: Mr.Yang
 * @create: 2019-05-02 16:11
 **/
public class StackTest {

    public static void main(String[] args) {
        ArrayStack integerArrayStack = new ArrayStack<>();
        for(int i=0;i<5;i++){
            integerArrayStack.push(i);
            System.out.println(integerArrayStack);
        }
        Integer pop = integerArrayStack.pop();
        System.out.println("----移除上級元素----value is "+pop);
        System.out.println("-------------移除之后的棧打印------------------");
        System.out.println(integerArrayStack);
    }
}
測試結果
stack: [0]            right value is stack top
stack: [0, 1]            right value is stack top
stack: [0, 1, 2]            right value is stack top
stack: [0, 1, 2, 3]            right value is stack top
stack: [0, 1, 2, 3, 4]            right value is stack top
----移除上級元素----value is 4
-------------移除之后的棧打印------------------
stack: [0, 1, 2, 3]            right value is stack top
leetCode第20題,花括號正確閉合
思路

根據(jù)棧的數(shù)據(jù)結構特點,我們可以先將所有左括號‘[{(’放進棧中,然后判斷當前字符如果是‘)]}’這種的右括號,但是棧頂?shù)睦ㄌ枀s不匹配,返回false

注意控制判斷

這里使用java自帶的棧工具類來實現(xiàn)

leetcode給的測試例子:

1 2 3 4 5
輸入例子 () ()[]{} (] ([)] {[]}
代碼實現(xiàn)
package com.datastructure.stack;

import java.util.Stack;

/**
 * @program: test
 * @description:
 * @author: Mr.Yang
 * @create: 2019-05-02 16:59
 **/
public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isValid("{"name": "網(wǎng)站","num": 3,"sites": [ "Google.com", "Taobao.com", "Waibo.wang" ]}"));
    }
    public boolean isValid(String s) {
        Stack characters = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == "{" || c == "[" || c == "(") {
                characters.push(c);
            } else {
                if(characters.isEmpty()){
                    return false;
                }
                Character peek = characters.pop();
                switch (c) {
                    case "}":
                        if (!peek.equals("{")) {
                            return false;
                        }
                        continue;
                    case "]":
                        if (!peek.equals("[")) {
                            return false;
                        }
                        continue;
                    case ")":
                        if (!peek.equals("(")) {
                            return false;
                        }
                        continue;
                }
            }
        }
        return characters.isEmpty();
    }

    /*public boolean isValid(String s) {
        Stack characters = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == "{" || c == "[" || c == "(") {
                characters.push(c);
            } else {
                if(characters.isEmpty()){
                    return false;
                }
                Character toChar = characters.pop();
                if(c == ")" && toChar != "("){
                    return false;
                }
                if(c == "}" && toChar != "{"){
                    return false;
                }
                if(c == "]" && toChar != "["){
                    return false;
                }
            }
        }
        return characters.isEmpty();
    }*/
}
如果想實現(xiàn)更多字符串關于括號的匹配,如JSON等等,可以根據(jù)棧的特點來實現(xiàn)

代碼例子GIT地址:https://git.dev.tencent.com/y...
項目簡介:
這個項目是我做測試,學習的主要項目,目前里面包含了:

一些設計模式的demo(抽象工程模式,適配器模式,外觀模式,命令模式,裝飾者模式等等)

即將學習的數(shù)據(jù)結構demo,數(shù)組,棧,后續(xù)還會持續(xù)更新數(shù)據(jù)結構,可能會有隊列,鏈表,遞歸,紅黑樹,線段樹等等一系列,如果感興趣,歡迎留言。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74386.html

相關文章

  • js數(shù)據(jù)結構和算法(二)和隊列

    摘要:對于棧來說,這個表尾稱為棧的棧頂,相應的表頭稱為棧底。棧和隊列的區(qū)別棧的插入和刪除操作都是在一端進行的,而隊列的操作卻是在兩端進行的。出棧操作出棧操作就是在棧頂取出數(shù)據(jù),棧頂指針隨之下移的操作。 基本概念 棧和隊列都是動態(tài)的集合,在棧中,可以去掉的元素是最近插入的哪一個。棧實現(xiàn)了后進先出。在隊列中,可以去掉的元素總是在集合中存在的時間最長的那一個。隊列實現(xiàn)了先進先出的策略。 棧的官...

    jsummer 評論0 收藏0
  • Java版-數(shù)據(jù)結構-

    摘要:介紹棧是一種后進先出的線性表數(shù)據(jù)結構,分為棧頂和棧底兩端,僅允許在表的一端插入元素,這一端被稱為棧頂,另外一端稱之為棧底。 介紹 棧是一種后進先出的線性表數(shù)據(jù)結構,分為棧頂和棧底兩端,僅允許在表的一端插入元素,這一端被稱為棧頂,另外一端稱之為棧底。棧,只有兩種操作,分為入棧(壓棧)和出棧(退棧);向棧中添加元素的操作叫做入棧,相反從棧中刪除元素叫做出棧。 特點 只能從棧頂添加元素或者...

    voidking 評論0 收藏0
  • JavaScript數(shù)據(jù)結構

    摘要:我們都知道數(shù)組是里面比較常用的一種數(shù)據(jù)結構,棧和數(shù)組類似,定義如下棧是一種遵從后進先出原則的有序集合。新增加和待刪除的元素都保存在棧的尾部,也稱棧頂,相反的另一端就叫棧底,在棧的這種數(shù)據(jù)結構里面,我們新增的元素都在棧頂,舊的元素都在棧底。 由于不是計算機專業(yè)出身,對數(shù)據(jù)結構這些了解的比較少,最近看了一些相關的書籍,這里做一些總結。本篇要說的是棧。我們都知道數(shù)組是JavaScript里面...

    nanchen2251 評論0 收藏0
  • finally與return之間的關系

    摘要:則會在轉移指令前執(zhí)行。總結與之間的關系如果在中含有語句,那么語句的還有作用嗎先看一段代碼如果你對內(nèi)存布局不是很清楚,請看這篇文章虛擬機類加載機制和字節(jié)碼執(zhí)行引擎重點關注運行時棧幀結構局部變量表槽,操作數(shù)棧。 定論 問:finally語句一定會執(zhí)行嗎?答: 如果沒有執(zhí)行相應的try語句則不會執(zhí)行。 在try語句中如果調(diào)用System.exit(0)方法則不會執(zhí)行。 問:finally...

    Yuanf 評論0 收藏0
  • JS數(shù)據(jù)結構學習:

    摘要:棧的應用前面介紹了那么多棧相關的知識,最后也是介紹棧的應用場景的時候了,棧的實際應用非常廣泛,例如用來存儲訪問過的任務或路徑撤銷的操作。 棧的定義 什么是棧?棧是一種遵循后進先出原則的有序集合,新添加的或者待刪除的元素都保存在棧的同一端,稱為棧頂,另一端稱為棧底,在棧里,新元素靠近棧頂,舊元素靠近棧底,用個圖來看大概這樣式的:showImg(https://segmentfault.c...

    Alfred 評論0 收藏0
  • js 調(diào)用機制與ES6尾調(diào)用優(yōu)化介紹

    摘要:調(diào)用棧的運行機制機制程序運行到一個函數(shù),它就會將其添加到調(diào)用棧中,當從這個函數(shù)返回的時候,就會將這個函數(shù)從調(diào)用棧中刪掉。在調(diào)用棧中每個調(diào)用偵都對應一個函數(shù),最上方的調(diào)用幀稱為當前幀,調(diào)用棧是由所有的調(diào)用偵形成的。 showImg(https://segmentfault.com/img/remote/1460000019244497?w=900&h=600); 調(diào)用棧的英文名叫做Cal...

    AaronYuan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<