亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將值“插入”到堆棧類中特定位置的函數失敗

將值“插入”到堆棧類中特定位置的函數失敗

烙印99 2022-06-22 17:16:54
我在 Python (以及一般編程)方面很新,試圖實現一個堆棧類,它具有一個函數來在堆棧中的任何位置 p '插入'一個值 v (即使考慮到它是一個堆棧它很奇怪)。這是我的堆棧類:class Stack:  def __init__(self, maxSize):    self.stack = list([])    self.maxSize = maxSize    self.size = int(0)這是我插入值的函數:def addValToPos(self, position, value):    temporaryList = [] # i tried to make a temporary list for every time the function was called    for i in range(len(self.stack)):        if i > position-1:            temporaryList += self.stack[i]    while self.size > position:        self.pop() #removes the last position in stack (LIFO)    self.push(value)    for j in range(len(temporaryList)):        self.stack += temporaryList[j]    #del temporarylist <-- tried to delete the list in the end of the function       當我嘗試執行該功能時,它第一次起作用,但第二次不起作用(因為我無法刪除臨時列表)。我認為最好temoraryList在函數中創建一個,然后在之后刪除它對此有什么想法,或者我應該如何在將temporaryList它們添加回之后刪除變量,self.stack以便它們在添加變量之后出現?這是我的函數調用:maxSize = int(input("Enter max size: "))stabel = Stack(maxSize)while stabel.size != stabel.maxSize:  value = input("Enter value: ")  stabel.push(value)stabel.print()while True:  if stabel.size < stabel.maxSize:    que = input("Add value to pos? (yes/no)")    if que.lower() == 'yes':        position = int(input("Add position p: "))        valToPos = int(input("Add value v: "))        stabel.addValToPos(position-1, valToPos)        stabel.size += 1    else:      break  elif stabel.size >= stabel.maxSize:    question0 = input("Increase the max size? (yes/no)")    if question0.lower() == 'yes':        addToMax0 = input("How much?")        stabel.increase(addToMax0)    else:      breakstabel.print()stabel.showSize()print("Maxsize: ", stabel.maxSize)此外,在第一次通過 while 循環之后,它似乎沒有檢查是否self.size小于self.maxSize. 也查不出來。順便說一句,如果代碼難以閱讀,我很抱歉,我在粘貼時遇到了一些麻煩。
查看完整描述

3 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

這似乎過于復雜了。Python 擁有我們稱之為slicing的簡潔工具。它可以做的一件事是改變列表的一個小節,包括修改它的長度。所以我們可以寫:


def addValToPos(alist, position, value):

    alist[position:position] = [value]

但是該操作已經可以作為list.insert.


其他小注意事項:[]創建一個新列表,list([])從而復制該空列表,然后將其丟棄。int(0)同樣是多余的,因為0已經是int; 這次沒有副本,因為int它是不可變的并且是部分實習的。


有一個完整的堆棧類也很奇怪,而沒有在那里定義它的任何行為。雖然 Pythonlist和deque類型涵蓋了堆棧功能,但實際堆棧將具有更簡單的一組操作;也許 push、pop 和 isempty。事實證明,您的其他片段依賴于這些,目前尚不清楚它們的作用;這意味著這會導致最小、完整、可驗證示例的完整部分失敗。


現在開始檢查代碼的意圖。


你的第if一個內部for意味著你應該從不同的范圍開始,因為有些position迭代什么都不做。好消息是,range完全有能力生產這種類型的范圍:range(position, len(self.stack))會做到的。


temporaryList += self.stack[i]可能不符合您的預期,因為它會從堆棧中取出一項并嘗試將其添加到temporaryList. 由于后者是一個列表,如果堆棧項不是列表,這將失敗,如果是,則合并它們。所以stack = [[1], [2]]會導致temporaryList = [1, 2]。也許您的意思是使用list.append而不是+=作為list.extend.


然后是第二遍調用pop從self. 這標志著一個隱含的依賴關系,即先前的訪問self.stack達到了相同的項目;它可能會self.push(v)充當self.stack.append(v),但我不知道。通常,在彈出時使用特定項目是個好主意;例如,如果我們正在專門使用堆棧進行練習,則將它們推入另一個堆棧。


看起來可以使用兩個切片操作替換整套預期操作:


temporaryList = self.stack[position:]

del self.stack[position:]

然后恢復循環通過提取項目和擴展再次執行展平操作。


我真的不知道你為什么認為你需要刪除temporaryList;它是一個局部變量,只存在于每個調用中。你也沒有向我們展示它是如何破壞的,所以我們缺乏關于你觀察和期望的信息。


我想我會停止猜測這一點。


查看完整回答
反對 回復 2022-06-22
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

我認為我temporaryList在第一次運行該函數后必須刪除的原因是因為當我運行我第二次發布的代碼時,我得到了這個輸出:


Enter max size: 6

Enter value: 1

Enter value: 2

Enter value: 3

Enter value: 4

Enter value: 5

Enter value: 6

# printing the numbers in self.stack

1

2

3

4

5

6

Increase the max size? (yes/no)yes

How much?2

# printing the numbers in self.stack

1

2

3

4

5

6

Size: 6

Maxsize:  8

Add value to pos? (yes/no)yes

Add position p: 2

Add value v: 9

# printing the numbers in self.stack

# this is the output i want

1

9

2

3

4

5

6

Size: 7

Maxsize:  8

Add value to pos? (yes/no)yes

Add position p: 1

Add value v: 8

# printing the numbers in self.stack

# here i don't know what happened

1

9

2

3

8

1

9

2

3

4

5

6

Size: 12

Maxsize:  8

Add value to pos? (yes/no)

相反,我只想增加一個添加的數字,就像我得到的第一個輸出一樣。提前致謝


查看完整回答
反對 回復 2022-06-22
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

我看到我沒有發布可運行的代碼。希望這有助于更多:


class Stack:

def __init__(self, maxSize):

    self.stack = list([])

    self.maxSize = maxSize

    self.size = int(0)


def push(self, value):

    self.stack.append(value)

    self.size += 1


def print(self):

    for i in range(len(self.stack)):

        print(self.stack[i])


def addValToPos(self, position, value):

    temporaryList = []

    if self.maxSize <= self.size:

        self.maxSize += 1

    for i in range(len(self.stack)):

        if i > position-1:

            temporaryList += self.stack[i]


    while self.size > position:

        self.pop()


    self.push(value)


    for j in range(len(temporaryList)):

        self.stack += temporaryList[j]

        #temporaryList.pop()



while True:

if stabel.size < stabel.maxSize:

    que = input("Add value to pos? (yes/no)")

    if que.lower() == 'yes':

        position = int(input("Add position p: "))

        valToPos = int(input("Add value v: "))

        stabel.addValToPos(position-1, valToPos)

        stabel.size += 1

    else:

        break

elif stabel.size >= stabel.maxSize:

    question0 = input("Increase the max size? (yes/no)")

    if question0.lower() == 'yes':

        addToMax0 = input("How much?")

        stabel.increase(addToMax0)

    else:

        break

stabel.print()

stabel.showSize()

print("Maxsize: ", stabel.maxSize)

輸出


Enter max size: 4

Enter value: 1

Enter value: 2

Enter value: 3

Enter value: 4

1

2

3

4

Increase the max size? (yes/no)yes

How much?1

1

2

3

4

Size: 4

Maxsize:  5

Add value to pos? (yes/no)yes

Add position p: 2

Add value v: 9

1

9

2

3

4

Size: 5

Maxsize:  5

Add value to pos? (yes/no) 

在這里我也很掙扎,因為 Size 和 Maxsize 是相同的(5),但它在 while True 循環的第一個 if 語句處停止,即使self.size和self.maxSize是相同的。我的意圖是self.maxSize在這一點上增加 elif 語句??赡苁且粋€菜鳥問題,但為此苦苦掙扎了一段時間。


查看完整回答
反對 回復 2022-06-22
  • 3 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號