9.python數(shù)據(jù)結(jié)構(gòu)之棧和隊列

一桩砰、棧

棧(stack)又名堆棧悍及,它是一種運(yùn)算受限的線性表。其限制是僅允許在表的一端進(jìn)行插入和刪除運(yùn)算墩崩。這一端被稱為棧頂昧绣,相對地规肴,把另一端稱為棧底。向一個棧插入新元素又稱作進(jìn)棧夜畴、入椡先校或壓棧,它是把新元素放到棧頂元素的上面贪绘,使之成為新的棧頂元素兑牡;從一個棧刪除元素又稱作出棧或退棧税灌,它是把棧頂元素刪除掉均函,使其相鄰的元素成為新的棧頂元素。

棧(Stack)是限制插入和刪除操作只能在一個位置進(jìn)行的表菱涤,該位置是表的末端苞也,稱為棧的頂(top)。棧的基本操作有PUSH(入棧)和POP(出棧)粘秆。棧又被稱為LIFO(后入先出)表如迟。

    1. 棧的實現(xiàn)
class Stack(object):
  def __init__(self):
    self.stack=[]
  def isEmpty(self):
    return self.stack==[]
  def push(self,item):
    self.stack.append(item)
  def pop(self):
    if self.isEmpty():
      raise IndexError,'pop from empty stack'
    return self.stack.pop()
  def peek(self):
    return self.stack[-1]
  def size(self):
    return len(self.stack)
    1. 棧的應(yīng)用
  1. 檢查程序中成對的符號
    程序的語法錯誤經(jīng)常是由缺少一個符號造成的」プ撸可用棧來檢查符號是否成對殷勘。做一個空棧,如果字符是開放符號('({[')則將其push棧中陋气。如果符號是個閉合符號(')]}'),則當(dāng)椑头停空時報錯,對應(yīng)'()}'的錯誤巩趁。否則痒玩,將棧pop淳附,如果彈出的符號不是對應(yīng)的開放符號,則報錯蠢古,對應(yīng)'(}'的錯誤奴曙。文件末尾,如果棧為空草讶,則報錯洽糟,對應(yīng)'({}'的錯誤。
def match(i,j):
  opens='([{'
  closes=')]}'
  return opens.index(i)==closes.index(j)
def syntaxChecker(string):
  stack=Stack()
  balanced=True
  for i in string:
    if i in '([{':
      stack.push(i)
    elif i in ')]}':
      if stack.isEmpty():
        balanced=False
        break
      else:
        j=stack.pop()
        if not match(j,i):
          balanced=False
          break
  if not stack.isEmpty():
    balanced=False
  return balanced
  1. 進(jìn)制轉(zhuǎn)換
    十進(jìn)制轉(zhuǎn)換二進(jìn)制:把十進(jìn)制轉(zhuǎn)成二進(jìn)制一直分解至商數(shù)為0堕战。從最底左邊數(shù)字開始讀坤溃,之后讀右邊的數(shù)字,從下讀到上嘱丢。


    十進(jìn)制轉(zhuǎn)二進(jìn)制計算
def decimal_to_bin(dec):
  stack=Stack()
  cur=dec
  while cur>0:
    a=cur%2
    cur=cur/2
    stack.push(a)
  binstr=''
  while not stack.isEmpty():
    binstr+=str(stack.pop())
  return binstr
  1. 后綴記法
    后綴記法(postfix)薪介,使用一個棧,見到一個數(shù)時入棧越驻,遇到一個運(yùn)算符時就作用于從棧彈出的兩個元素汁政,將結(jié)果彈入棧中。
    (7+8)/(3+2)可以寫作7 8 + 3 2 + /


    后綴記法
def infixtoPostfix(infix):
  a={}
  a['*']=3
  a['/']=3
  a['+']=2
  a['-']=2
  a['(']=1
  stack=Stack()
  post=''
  for i in infix:
    if i not in a and i!=')':
      post+=i
    elif i=='(':
      stack.push(i)
    elif i==')':
      top=stack.pop()
      while top!='(':
        post+=top
        top=stack.pop()
    else:     
      while not stack.isEmpty() and a[i]<=a[stack.peek()]:
        post+=stack.pop()
      stack.push(i)
  while not stack.isEmpty():
    post+=stack.pop()
  return post
           
def postfixExp(postfix):
  stack=Stack()
  postlist=postfix.split()
  for i in postlist:
    if i not in '+-*/':
      stack.push(i)
    else:
      a=stack.pop()
      b=stack.pop()
      result=math(i,b,a)
      stack.push(result)
  return stack.pop()
def math(x,y,z):
  if x=='+':
    return float(y)+float(z)
  if x=='-':
    return float(y)-float(z)
  if x=='*':
    return float(y)*float(z)
  if x=='/':
    return float(y)/float(z)

二缀旁、隊列

隊列是一種特殊的線性表记劈,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作并巍,和棧一樣目木,隊列是一種操作受限制的線性表。進(jìn)行插入操作的端稱為隊尾履澳,進(jìn)行刪除操作的端稱為隊頭嘶窄。
隊列(queue)也是表怀跛,使用隊列時插入和刪除在不同的端進(jìn)行距贷。隊列的基本操作是Enqueue(入隊),在表的末端(rear)插入一個元素吻谋,還有出列(Dequeue)忠蝗,刪除表開頭的元素。

    1. 隊列的實現(xiàn)
class Queue(object):
  def __init__(self):
    self.queue=[]
  def isEmpty(self):
    return self.queue==[]
  def enqueue(self,x):
    self.queue.append(x)
  def dequeue(self):
    if self.queue:
      a=self.queue[0]
      self.queue.remove(a)
      return a
    else:
      raise IndexError,'queue is empty'
  def size(self):
    return len(self.queue)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漓拾,一起剝皮案震驚了整個濱河市阁最,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骇两,老刑警劉巖速种,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異低千,居然都是意外死亡配阵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棋傍,“玉大人救拉,你說我怎么就攤上這事√奔穑” “怎么了亿絮?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長麸拄。 經(jīng)常有香客問我派昧,道長,這世上最難降的妖魔是什么拢切? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任斗锭,我火速辦了婚禮,結(jié)果婚禮上失球,老公的妹妹穿的比我還像新娘岖是。我一直安慰自己,他們只是感情好实苞,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布豺撑。 她就那樣靜靜地躺著,像睡著了一般黔牵。 火紅的嫁衣襯著肌膚如雪聪轿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天猾浦,我揣著相機(jī)與錄音陆错,去河邊找鬼。 笑死金赦,一個胖子當(dāng)著我的面吹牛音瓷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夹抗,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼绳慎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漠烧?” 一聲冷哼從身側(cè)響起杏愤,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎已脓,沒想到半個月后珊楼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡度液,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年厕宗,在試婚紗的時候發(fā)現(xiàn)自己被綠了邓了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡媳瞪,死狀恐怖骗炉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛇受,我是刑警寧澤句葵,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站兢仰,受9級特大地震影響乍丈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜把将,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一轻专、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧察蹲,春花似錦请垛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亚兄,卻和暖如春混稽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背审胚。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工匈勋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膳叨。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓洽洁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親懒鉴。 傳聞我的和親對象是個殘疾皇子诡挂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容