1. 程式人生 > >python資料結構 -棧(1) 解決括號問題

python資料結構 -棧(1) 解決括號問題

在上一篇文章中,我們學習了python的棧的結構,這篇我們將對棧繼續挖掘,來看下這個結構對我們來說具體有什麼用處。

我們現在要做的是,如何解決括號匹配問題。比如有一個這樣的 "()" 字串,我們想判斷這個括號是不是合法的,能不能匹配。

比如 "(()"這樣的括號顯然是不行的,我們要的是有一個左括號"(",就必有一個右括號")",但這樣明顯還是不夠,如果括號以"))(("的形式出現呢,這樣想來似乎要解決這個看起來很簡單的問題還很困難,沒關係,用我們之前學的棧就能很輕鬆的解決這個問題!

思路如下:

當出現"("時,push入棧,遇到")"時再出棧,最後只要棧是空的,那麼括號就匹配。但是稍微思考下又會出現問題,如果"())"這樣的情況怎麼處理呢。

我們再設定一個布林變數,預設為True,如果在遍歷完成前棧就空了,那麼就將他設定為False。

程式碼如下:

def parChecker1(symbolString):
    s = Stack()
    balanced = True
    index = 0

    while index < len(symbolString) and balanced:
        symbol = symbolString[index]
        #print len(symbolString)
       # print index
        #print symbol
        if symbol == '(':
            s.push(symbol)
            #print "="
        else:
            if s.isEmpty():
                balanced =False
                #print "null"
            else:
                s.pop()
                #print "pop"
        index = index +1

    if balanced and s.isEmpty():
        return True
    else:
        return False

print parChecker1('((()))')
print parChecker1('(()')

這個問題解決了,感到很開心,但是現在又有新的挑戰。如果要求匹配的括號是“(({{}}))[]”又該怎麼處理呢,參照之前的經驗,可以發現其實原理是一樣的,但是需要多一步來驗證"()" ,"{}","[]"是否匹配,需要將棧頂的元素和遍歷的元素進行比較,如果都是一對那麼就一切ok,如果不是一對則需要將布林變數設為FALSE。連續寫三個if顯得太傻了,我們有更聰明的變法

程式碼如下:

def parChecker2(symbolString):
    s = Stack()
    balaced = True
    index = 0

    while index < len(symbolString) and balaced:
        symbol = symbolString[index]
        if symbol in "([{":
            s.push(symbol)
        else:
            if s.isEmpty():
                balaced = False
            else:
                top = s.pop()
                if not matches(top,symbol):
                    balaced = False
        index += 1
    if balaced and s.isEmpty():
        return True
    else:
        return False

def matches(open,close):
        opens = "({["
        closers = ")}]"
        return opens.index(open) == closers.index(close)
print parChecker2('{{([][])}()}')
print parChecker2('[{()]')

看到這兒感覺演算法真是很神奇啊,很有趣,要繼續xuo習

完整原始碼地址:

https://github.com/fank-cd/python_stucture

相關推薦

python資料結構 -(1) 解決括號問題

在上一篇文章中,我們學習了python的棧的結構,這篇我們將對棧繼續挖掘,來看下這個結構對我們來說具體有什麼用處。我們現在要做的是,如何解決括號匹配問題。比如有一個這樣的 "()" 字串,我們想判斷這個括號是不是合法的,能不能匹配。比如 "(()"這樣的括號顯然是不行的,我們

Python資料結構——

由於棧具有後入先出的特點,所以任何不在棧頂的元素都無法訪問。為了得到棧底的元素,必須先拿掉上面的元素。 對棧的兩種主要操作是將一個元素壓入棧和將一個元素彈出棧。入棧使用push()方法,出棧使用pop()方法。下圖演示了入棧和出棧的過程。 另一個常用的操作是預覽棧頂的元素。pop()方法雖然可以訪問棧頂的

C資料結構-和佇列,括號匹配舉例---ShinePans

1.棧和佇列是兩種特殊的線性表             運算操作被限定只能在表的一端或兩端插入,刪除元素,故也稱它們為限定的線性表結構 2.棧的基本運算 1).Stackinit(&s) 構造一個空棧 2).Stackempty(s) 判斷s是否為空棧,當s為空棧

資料結構1)——順序的實現,以及括號匹配的應用

為什麼從堆疊開始?因為我覺得線性部分比較簡單的是堆疊和佇列,用得也比較多,有不少人覺得連結串列才簡單啊,其實連結串列簡單嗎?連結串列可以派生的東西反而很多,不是一時半會可以理解的,還記得在一篇微軟的招聘心得回顧文上看到,微軟的面試官就問他怎樣用兩個連結串列實現一個棧。當然,

Python資料結構之: 與佇列

棧(stacks) 是一種只能通過訪問其一端來實現資料儲存與檢索的線性資料結構,具有後進先出(last in first out,LIFO)的特徵 stack = [] stack.append("A") #A入棧 stack.append("B") #B入棧 st

python資料結構與演算法(1

資料結構與演算法(Python) Why?我們舉⼀個可能不太恰當的例⼦:如果將開發程式的過程⽐喻為作戰,我們碼農便是指揮作戰的將軍,⽽我們 所寫的程式碼便是⼠兵和武器。那麼資料結構和演算法是什麼?答⽈:兵法!我們可以不看兵法在戰場上⾁搏,如此,可能會勝利,可能會失敗。即使勝 利,可能也會付出巨⼤的代價。我們寫

Python資料結構與演算法相關問題與解決技巧

1.如何在列表, 字典, 集合中根據條件篩選資料 from random import randint data = [randint(-10,10) for _ in range(10)] data [4, 4, -5, 6, 7, 10, 5, -7, -6, -9] # 篩選出列表中大於0的元

大話資料結構讀書筆記艾提拉總結 查詢演算法 和排序演算法比較好 第1資料結構緒論 1 第2章演算法 17 第3章線性表 41 第4章與佇列 87 第5章串 123 第6章樹 149 第7章圖 21

大話資料結構讀書筆記艾提拉總結   查詢演算法 和排序演算法比較好     第1章資料結構緒論 1 第2章演算法 17 第3章線性表 41 第4章棧與佇列 87 第5章串 123 第6章樹 149 第7章圖 211

括號匹配問題(資料結構——)

題目描述: 思路: 程式碼實現 #ifndef STACK #define STACK typedef struct { char str[200]; int top; }*stack, Stack; #endif #define ma

案例3.2:括號匹配的檢驗(c++實現/資料結構/的基本操作)

#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status

資料結構 的定義 練習1:數制轉換

自己隨手寫的並未通過oj判斷: #include <iostream> #include <cstdio> #include <malloc.h> #define STACK_INIT_SIZE 100 #define STA

Python 資料結構筆記(1):Python資料結構的效能

本系列部落格是閱讀《Problem Solving with Algorithms and Data Structures using Python》的筆記,原文連結 1、列表 List 索引和賦值是兩個非常常用的操作。這個兩個操作不論列表多長,它們的時間複雜

python資料結構和佇列

1.功能實現 之前文章有,可以點開看看 棧 佇列 2.應用(1)括號匹配及字尾表示式 class Solution(object): def isValid(self, s): """ :type s: str :rtype

python-資料結構程式碼

  from pythonds.basic.stack import Stack def parChecker(symbolString): s=Stack() balanced=True index=0 while index<len(symbolS

資料結構————括號匹配(c++)

同樣是用棧模板寫的,實現上比慕課網上講的簡單一些,沒有定義兩個棧,而是直接判斷是否是左括號,是的話就在MyStack中push另一半括號;如果是右括號且又不是需要的括號,就直接列印不匹配,如果是需要的右括號,就pop掉左括號。最後看mystack中棧頂是否為0,為0則列印括

python 資料結構之佇列和

# 棧是一種特殊的線性表,僅能線上性表的一端操作,棧頂允許操作,棧底不允許操作。 # 棧的特性:後進先出 class Stack(object): """棧""" def __init__(self): self.items=[] def is_empty(s

1.6 python資料結構之雙向連結串列/迴圈連結串列——以OrderedDict資料結構為例

在連結串列這一部分的最後,我們以python中十分強大的collections包中的OrderedDict為例,看一下雙向迴圈列表的功能實現。 OrderedDict 它提供了有序的dict結構,因此他不是常規的雜湊雜湊表,為了保證儲存物件有序,它用連結串列實現了這一功能,

5.1 python資料結構與演算法之演算法思想概述

常見的演算法思想概述: 這一章開始介紹演算法知識, 為後面的學習奠定基礎,除了下一節要介紹的遞迴外,後面還將詳細介紹 動態規劃, 貪心等思想, 更重要的是,後續查詢,排序等常見演算法中,均要涉及到這些基礎的演算法思想。 演算法的英文名稱是Algorithm,這個詞在1957年之前在Webst

資料結構-的應用-算術表示式小括號匹配

資料結構高分筆記,第3章《棧》的第一個例題,題目要求檢測算術表示式中小括號匹配是否合法。感覺自己的演算法還是有點弱智啊,這麼多判斷好像很low逼!!!! #include <stdio.h> #include <string.h> #define

"西遊記"主題Python入門示例嘗試-資料結構 5.1-5.1.2

(見前: 中文程式碼示例視訊演示Python入門第五章 資料結構) 仍然基於官方文件, 歡迎建議(尤其是如何取材). 5. Data Structures - More on Lists 列表詳述 >>> 人物 = ['佛', '妖', '凡人', '菩薩', '妖