劍指Offer(一) 棧

2021-10-20 18:13:52 字數 4139 閱讀 1448

目錄

1、用兩個棧來實現乙個佇列,完成佇列的push和pop操作。

2、棧的壓入、彈出序列

思路:3、包含min函式的棧

思路:c++解答

python解答

4、二叉搜尋樹的後序遍歷序列

5、按之字形順序列印二叉樹

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

# -*- coding:utf-8 -*-

class solution:

def __init__(self):

self.stack1, self.stack2 = ,

def push(self, node):

# write code here

def pop(self):

# return xx

if self.stack2:

return self.stack2.pop()

if not self.stack1:

return -1

while self.stack1:

return self.stack2.pop()

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

new乙個棧,將pushv逐步入棧,隨時比較棧頂元素。

# -*- coding:utf-8 -*-

class solution:

def ispoporder(self, pushv, popv):

# write code here

stack =

index = 0

for item in pushv:

while stack and stack[-1] == popv[index]:

stack.pop()

index += 1

if stack==:

return true

else:

return false

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式。(時間複雜度應為o(1))

對於時間複雜度的要求,所以需要在棧的每乙個過程中,都可以實時判斷得出最小元素。所以下面第乙個做法不對。

常見做法,新增乙個輔助棧,存放最小元素。

此外,比較巧妙的做法還有每次在確認新入棧value值為最小值時,先將當前(即新min_val入棧前)的最小value入棧儲存,再更新最小值,然後新value入棧。如做法2。

先將當前最小value儲存的意義在於,pop時上乙個value出去後可以及時更新當前最小值。

# -*- coding:utf-8 -*-

class solution:

def __init__(self):

self.arr =

def push(self, node):

# write code here

def pop(self):

# write code here

return self.arr.pop()

def top(self):

# write code here

return self.arr[-1]

def min(self):

# write code here

return min(self.arr)

class solution 

s.push(value);

}void pop()

else

s.pop();

}int top()

int min()

};

同思路

import sys

max_value = sys.maxsize

min_value = - sys.maxsize - 1

全部解答

# -*- coding:utf-8 -*-

import sys

class solution:

def __init__(self):

self.stack =

self.min_val = sys.maxsize

def push(self, node):

# write code here

if node < self.min_val:

self.min_val = node

else:

def pop(self):

# write code here

if self.stack[-1]==self.min_val:

self.stack.pop()

self.min_val = self.stack[-1]

self.stack.pop()

else:

self.stack.pop()

def top(self):

# write code here

return self.stack[-1]

def min(self):

# write code here

return self.min_val

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。

二叉搜尋樹的中序遍歷結果為從小到大的排列

# -*- coding:utf-8 -*-

class solution:

def verifysquenceofbst(self, sequence):

# write code here

if not sequence:

return false

root = sequence[-1]

i = 0

while i < len(sequence)-1:

if sequence[i]>root:

break

i += 1

for j in range(i,len(sequence)-1):

if sequence[j]0:

left = self.verifysquenceofbst(sequence[:i])

if i > len(sequence)-1:

right = self.verifysquenceofbst(sequence[i:len(sequence)-1])

return left&right

請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

# -*- coding:utf-8 -*-

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution:

def print(self, proot):

ans =

if not proot:

return ans

def helper(node, level):

if len(ans) == level:

if level%2 == 0:

else:

ans[level].insert(0, node.val)

if node.left:

helper(node.left, level+1)

if node.right:

helper(node.right, level+1)

helper(proot,0)

return ans

劍指offer 棧相關

回歸一下基本概念 python 實現棧 例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 思路 借用乙個輔助的棧,遍歷壓棧順序,先將第乙個放入棧中,這裡是1,然後判斷棧...

棧和佇列 劍指offer

題目 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的 min函式。class solution def init self self.elem def push self,node def pop self return self.elem.pop def top self return...

《劍指offer》 佇列和棧

一 兩個棧實現乙個佇列 題目 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解題思路 用乙個棧來存,另乙個棧出。需要考慮的情況如下 class solution int pop else if stack1.size 0 出隊 res stack2.top sta...