为了账号安全,请及时绑定邮箱和手机立即绑定

将值“插入”到堆栈类中特定位置的函数失败

将值“插入”到堆栈类中特定位置的函数失败

烙印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 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信