成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

線性結(jié)構(gòu) 隊(duì)列與棧

Turbo / 3473人閱讀

摘要:線性結(jié)構(gòu)隊(duì)列與棧棧棧是一種遵循先進(jìn)后出原則的有序列表,新添加或待刪除的元素都保存在棧的一端,這一端被稱作為棧頂,另一端被稱作為棧底。將字符串的每個(gè)字符按順序亞入棧。

線性結(jié)構(gòu) 隊(duì)列與棧

棧(Stack)是一種遵循先進(jìn)后出(LIFO)原則的有序列表,新添加或待刪除的元素都保存在棧的一端,這一端被稱作為棧頂,另一端被稱作為棧底。在棧里,新元素都靠近棧頂,舊元素都靠近棧底。

棧的操作
方法 操作
push 添加新元素到棧頂
pop 移除并返回棧頂元素
peek 返回棧頂元素
size 返回棧大小
clear 移除棧內(nèi)所有元素
isEmpty 判斷棧是否為空
Python實(shí)現(xiàn)棧
# python3
class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[-1]

    def size(self):
        return len(self.items)

    def clear(self):
        self.items = []

    def is_empty(self):
        return self.items == []
JavaScript實(shí)現(xiàn)棧
// ES6
class Stack {
    constructor() {
        this.items = [];
    }
    push(item) {
        this.items.push(item);
    }
    pop() {
        return this.items.pop();
    }
    peek() {
        return this.items[-1];
    }
    size() {
        return this.items.length;
    }
    clear() {
        this.items = [];
    }
    isEmpty() {
        return this.items.length === 0;
    }
}
隊(duì)列

隊(duì)列(Queue)是一種遵循先進(jìn)先出(FIFO)原則的有序列表。隊(duì)列在尾部添加新元素,從頂部移除元素。最新添加的元素必須排列在隊(duì)列的末尾。

隊(duì)列操作
方法 操作
enqueue 添加新元素到隊(duì)列尾部
dequeue 移除并返回隊(duì)首元素
front 返回隊(duì)首元素
size 返回隊(duì)列大小
clear 移除隊(duì)列內(nèi)所有元素
isEmpty 判斷隊(duì)列是否為空
Python實(shí)現(xiàn)隊(duì)列
# python3
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        return self.items.pop(0)

    def front(self):
        return self.items[0]

    def size(self):
        return len(self.items)

    def clear(self):
        self.items = []
    
    def is_empty(self):
        return self.items == []
JavaScript實(shí)現(xiàn)隊(duì)列
// ES6
class Queue {
    constructor() {
        this.items = [];
    }
    enqueue(item) {
        this.items.push(item);
    }
    dequeue() {
        return this.items.shift();
    }
    front() {
        return this.items[0];
    }
    size() {
        return this.items.length;
    }
    def clear() {
        this.items = [];
    }
    isEmpty () {
        return this.items.length === 0;
    }
}
棧的應(yīng)用 回文檢索

回文是指一種現(xiàn)象,一個(gè)單詞、短語或數(shù)字,從前往后和從后往前都是一樣的。

# 單詞
dad
racecar
# 數(shù)字
1001

使用棧,可以輕松判斷一個(gè)字符串是否是回文。將字符串的每個(gè)字符按順序亞入棧。當(dāng)字符串中的字符都入棧后,棧內(nèi)就保存了一個(gè)反轉(zhuǎn)后的字符串。通過彈出棧內(nèi)每個(gè)字母可以得到一個(gè)新字符,只需要比較兩個(gè)字符串即可。

# python3
def palindrome(word):
    s = Stack()
    word = str(word)
    rword = ""

    for i in word:
        s.push(i)

    while not s.is_empty():
        rword += s.pop()
    
    return word == rword
// ES6
function palindrome(word) {
    let s = new Stack();
    word = String(word);
    let rword = "";
    for (i of word) {
        s.push(i);
    }
    while (! s.isEmpty()) {
        rword += s.pop();
    }
    return word === rword;
}
簡單括號(hào)匹配

在表達(dá)式中,括號(hào)必須以匹配的方式出現(xiàn)。括號(hào)匹配意味著每個(gè)開始符號(hào)具有相應(yīng)的結(jié)束符號(hào),并且括號(hào)能被正確嵌套。

(5+6)*(7+8)/(4+3)  # 括號(hào)匹配
(2+3)+24/12+(4-2   # 括號(hào)不匹配

??梢杂脕砼袛嘁粋€(gè)表達(dá)式中的括號(hào)是否匹配。從空棧開始,從左到右處理表達(dá)式。如果一個(gè)符號(hào)是一個(gè)開始符號(hào),將其作為一個(gè)信號(hào),對(duì)應(yīng)的結(jié)束符號(hào)稍后會(huì)出現(xiàn)。另一方面,如果符號(hào)是結(jié)束符號(hào),彈出棧,只要彈出棧的開始符號(hào)可以匹配每個(gè)結(jié)束符號(hào),則括號(hào)保持匹配狀態(tài)。如果任何時(shí)候棧上沒有出現(xiàn)符合開始符號(hào)的結(jié)束符號(hào),則字符串不匹配。最后,當(dāng)所有符號(hào)都被處理后,棧應(yīng)該是空的。

# python3
def par_checker(expression):
    s = Stack()
    balanced = True
    index = 0
    while index < len(expression) and balanced:
        symbol = expression[index]
        if symbol == "(":
            s.push(symbol)
        elif symbol == ")":
            item = s.pop()
            if item != "(":
                balanced = False
        index += 1
    return balanced and s.is_empty()
// ES6
function parChecker(expression) {
    let s = new Stack();
    let balanced = true;
    let index = 0;
    while (index < expression.length && balanced) {
        symbol = expression[index]
        if (symbol === "(") {
            s.push(symbol);
        } else if (symbol === ")") {
            let item = s.pop();
            if (item !== "(") {
                balanced = false;
            }
        }
        index += 1;
    }
    return balanced && s.isEmpty();
}
進(jìn)制轉(zhuǎn)換

在生活中,我們主要使用十進(jìn)制數(shù)。但在計(jì)算科學(xué)中,二進(jìn)制非常重要,因?yàn)橛?jì)算機(jī)里的內(nèi)容都是用二進(jìn)制數(shù)字表示的(0和1)。如果沒有進(jìn)制轉(zhuǎn)化的能力,與計(jì)算機(jī)交流就會(huì)非常困難。

要把十進(jìn)制數(shù)轉(zhuǎn)化成二進(jìn)制的算法,將十進(jìn)制數(shù)與2相除,并取余數(shù)。

10 => 1010
10/2 = 5, rem = 0
 5/2 = 2, rem = 1
 2/2 = 1, rem = 0
 1/2 = 0, rem = 1

Python實(shí)現(xiàn)

# python3
def divide_by2(dec_str):
    s = Stack()
    dec_num = int(dec_str)
    bin_str = ""
    while dec_num > 0:
        rem = dec_num % 2
        s.push(rem)
        dec_num //= 2

    while not s.is_empty():
        bin_str += str(s.pop())

    return bin_str

同理,我們可以推導(dǎo)出十進(jìn)制數(shù)轉(zhuǎn)化八進(jìn)制和十六進(jìn)制算法。以下是完整的進(jìn)制轉(zhuǎn)換算法。

# python3
def base_converter(dec_str, base):
    s = Stack()
    digits = "0123456789ABCDEF"
    dec_num = int(dec_str)
    new_str = ""

    while dec_num > 0:
        rem = dec_num % base
        s.push(rem)
        dec_num //= base

    while not s.is_empty():
        new_str += digits[s.pop()]

    return new_str
// ES6
function baseConverter(decStr, base) {
    let s = new Stack();
    let digits = "0123456789ABCDEF";
    let decNum = Number(decStr);
    let newStr = "";
    while (decNum > 0) { 
        rem = decNum % base;
        s.push(rem)
        decNum = Math.floor(decNum/base);
    }
    while (! s.isEmpty()) {
        newStr += digits[s.pop()]
    }
    return newStr;
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44807.html

相關(guān)文章

  • 線性結(jié)構(gòu) 隊(duì)列與棧

    摘要:線性結(jié)構(gòu)隊(duì)列與棧棧棧是一種遵循先進(jìn)后出原則的有序列表,新添加或待刪除的元素都保存在棧的一端,這一端被稱作為棧頂,另一端被稱作為棧底。將字符串的每個(gè)字符按順序亞入棧。 線性結(jié)構(gòu) 隊(duì)列與棧 棧 棧(Stack)是一種遵循先進(jìn)后出(LIFO)原則的有序列表,新添加或待刪除的元素都保存在棧的一端,這一端被稱作為棧頂,另一端被稱作為棧底。在棧里,新元素都靠近棧頂,舊元素都靠近棧底。 棧的操作 ...

    Turbo 評(píng)論0 收藏0
  • 我的面試準(zhǔn)備過程--隊(duì)列與棧(更新中)

    摘要:和三個(gè)方法的時(shí)間復(fù)雜度必須為兩種解法,解法一,將最小值存入自有的數(shù)據(jù)結(jié)構(gòu)中,如下所示原本的值最小值解法二,用兩個(gè)棧 堆棧和隊(duì)列統(tǒng)稱線性表 簡單的線性結(jié)構(gòu) 數(shù)組和鏈表可以實(shí)現(xiàn)這兩種數(shù)據(jù)結(jié)構(gòu) 堆棧 基本理解 DFS 深度優(yōu)先---按深度遍歷 遞歸轉(zhuǎn)非遞歸 隊(duì)列 基本理解 BFS 廣度優(yōu)先---按層序遍歷 出入棧的合法性模擬出入棧的過程,不是入棧,就是...

    EastWoodYang 評(píng)論0 收藏0
  • js數(shù)據(jù)結(jié)構(gòu)和算法(一)概述

    摘要:程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)就是關(guān)系,沒錯(cuò),就是數(shù)據(jù)元素相互之間存在的一種或多種特定關(guān)系的集合。物理結(jié)構(gòu)是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)形式。 程序設(shè)計(jì)=數(shù)據(jù)結(jié)構(gòu)+算法 數(shù)據(jù)結(jié)構(gòu) 數(shù)據(jù)結(jié)構(gòu)就是關(guān)系,沒錯(cuò),就是數(shù)據(jù)元素相互之間存在的一種或多種特定關(guān)系的集合。 傳統(tǒng)上,我們把數(shù)據(jù)結(jié)構(gòu)分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。 邏輯結(jié)構(gòu):是指數(shù)據(jù)對(duì)象中數(shù)據(jù)元素之間的相互關(guān)系,也是我們今后最...

    xumenger 評(píng)論0 收藏0
  • 【譯】JavaScript數(shù)據(jù)結(jié)構(gòu)(2):棧與隊(duì)列

    摘要:棧和隊(duì)列是開發(fā)中最常用的兩種數(shù)據(jù)結(jié)構(gòu)。如果又有數(shù)據(jù)入棧,的值將增加到。如果一個(gè)數(shù)據(jù)從棧中被取出,的值將會(huì)減少為。隊(duì)列與棧類似,隊(duì)列也是一個(gè)線性數(shù)據(jù)結(jié)構(gòu)。與棧不同的是,隊(duì)列只刪除最先添加的數(shù)據(jù)。現(xiàn)在,讓我們將棧大小的實(shí)現(xiàn)應(yīng)用到隊(duì)列中。 翻譯:瘋狂的技術(shù)宅英文:https://code.tutsplus.com/art...說明:本文翻譯自系列文章《Data Structures With...

    zlyBear 評(píng)論0 收藏0
  • js堆,棧與隊(duì)列

    摘要:內(nèi)存空間又被分為兩種,棧內(nèi)存與堆內(nèi)存。今天就堆棧隊(duì)列的內(nèi)容就大概說到這里下一篇博客在繼續(xù)說一下,有什么說的不對(duì)或者不足的地方,請(qǐng)大家批評(píng)指正 棧的定義 棧是計(jì)算機(jī)科學(xué)中的一種抽象數(shù)據(jù)類型,只允許在有序的線性數(shù)據(jù)集合的一端(稱為堆棧頂端,英語:top)進(jìn)行加入數(shù)據(jù)(英語:push)和移除數(shù)據(jù)(英語:pop)的運(yùn)算。因而按照后進(jìn)先出(LIFO, Last In First Out)的原理運(yùn)...

    Kosmos 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<