如何实现 process_deque(commands) 来测试我的 Deque 函数?

问题描述

首先,我需要实现一个 Deque 函数

push_front 在双端队列的头部添加一个

push_back 在双端队列的尾部添加一个

pop_front 从双端队列的头部提取一个键并返回它

pop_back 从双端队列的尾部提取一个键并返回

front 返回头部元素而不删除

back 返回尾部元素而不删除

size 返回双端队列中元素的数量

clear 从双端队列中删除所有元素

使用此方法错误处理实现 Deque 类。对于 pop_frontpop_front,pop_backpop_back,front,back 方法必须检查双端队列中是否有元素。如果它为空,则该方法必须返回字符串“error”而不是数值。

push_frontpush_backclear 方法必须返回字符串“ok”。

最后实现 process_deque(commands),它接受命令列表并返回每个命令的答案列表。

class Deque:

    def __init__(self,max_len = 60000):
        self.max_len = max_len + 1
        self.queue = [0] * self.max_len
        self.head = 0
        self.tail = 0


    def push_front(self,key):
        self.queue[self.head] = key
        self.head= (self.head - 1) % self.max_len
        return "ok"

    def push_back(self,key):
        self.queue[self.tail] = key
        self.tail = (self.tail + 1) % self.max_len
        return "ok"


    def pop_front(self):
        if self.head == self.tail:
            return "error"
        else:
            res = self.queue[self.head]
            self.head = (self.head + 1) % self.max_len
            return res

    def pop_back(self):
        res = self.queue[self.tail]
        self.tail = (self.tail - 1) % self.max_len
        return res

    def front(self):
        if self.head == self.tail:
            return "error"
        else:
            return self.queue[self.head]

    def back(self):
        if self.head == self.tail:
            return "error"
        else:
            return self.queue[self.tail]

    def clear(self):
        self.queue = []
        return "ok"


    def size(self):
        return len(self.queue)


def process_deque(commands):


if __name__ == "__main__": # ***This is the 3 test case***
    test_cmd = ["push_front 1","push_front 2","push_back 6","front","back","clear","size","back"]
    # should print ["ok","ok",2,6,"error"]
    print(process_deque(test_cmd))

    test_cmd = ["pop_front","push_back 2","size"]
    # should print ["error","error",1]
    print(process_deque(test_cmd))

    test_cmd = ["push_back 1","push_front 10","push_front 4","push_front 5","pop_back",1,10,4]
    print(process_deque(test_cmd))

我不确定如何实现 process_deque(commands) 来测试案例。

谢谢。

我只是调整了我的 Deque 函数,下面的代码更简洁,因为我不知道如何实现 process_deque(commands),所以我根本没有测试它。

class Deque:

    def __init__(self):
        self.item = []


    def push_front(self,key):
        self.item.append(key)
        return "ok"

    def push_back(self,key):
        self.items.insert(0,key)
        return "ok"


    def pop_front(self):
        if self.head == self.tail:
            return "error"
        else:
            self.items.pop()

    def pop_back(self):
        return self.items.pop(0)

    def front(self):
        if self.head == self.tail:
            return "error"
        else:
            return self.item[0]

    def back(self):
        if self.head == self.tail:
            return "error"
        else:
            return self.item[-1]

    def clear(self):
        self.queue = []
        return "ok"


    def size(self):
        return len(self.queue)

解决方法

您可以使用 getattr 方法来获取提到的方法 here

def process_deque(commands):
    d = Deque()
    output = []
    for each_command in commands:
        splitted = each_command.split(" ")
        method_name = splitted[0]
        arg = splitted[1] if len(splitted)==2 else None
        method = getattr(d,method_name)
        if(arg):
            output.append(method(arg))
        else:
            output.append(method())
    return output

但是您的 deque 类方法实现不正确。 这不在此问题的范围内,因此为了表明上述方法是正确的,我使用的是 python list,它本身可以充当 deque

class Deque:

    def __init__(self,max_len = 60000):
#         self.max_len = max_len + 1
#         self.queue = [0] * self.max_len
#         self.head = 0
#         self.tail = 0
        self.queue = []


    def push_front(self,key):
#         self.queue[self.head] = key
#         self.head= (self.head - 1) % self.max_len
        self.queue.insert(0,key)
        return "ok"

    def push_back(self,key):
#         self.queue[self.tail] = key
#         self.tail = (self.tail + 1) % self.max_len
        self.queue.append(key)
        return "ok"


    def pop_front(self):
#         if self.head == self.tail:
#             return "error"
#         else:
#             res = self.queue[self.head]
#             self.head = (self.head + 1) % self.max_len
#             return res
        if len(self.queue) == 0:
            return "error"
        else:
            res = self.queue.pop(0)
            return res

    def pop_back(self):
#         res = self.queue[self.tail]
#         self.tail = (self.tail - 1) % self.max_len
        if len(self.queue) == 0:
            return "error"
        else:
            res = self.queue.pop()
            return res
        return res

    def front(self):
        if len(self.queue) == 0:
            return "error"
        else:
            return self.queue[0]

    def back(self):
        if len(self.queue) == 0:
            return "error"
        else:
            return self.queue[-1]

    def clear(self):
        self.queue.clear()
        return "ok"


    def size(self):
        return len(self.queue)


def process_deque(commands):
    d = Deque()
    output = []
    for each_command in commands:
        splitted = each_command.split(" ")
        method_name = splitted[0]
        arg = splitted[1] if len(splitted)==2 else None
        method = getattr(d,method_name)
        if(arg):
            output.append(method(arg))
        else:
            output.append(method())
    return output
        


if __name__ == "__main__": # ***This is the 3 test case***
    test_cmd = ["push_front 1","push_front 2","push_back 6","front","back","clear","size","back"]
    # should print ["ok","ok",2,6,"error"]
    print(process_deque(test_cmd))

    test_cmd = ["pop_front","push_back 2","size"]
    # should print ["error","error",1]
    print(process_deque(test_cmd))

    test_cmd = ["push_back 1","push_front 10","push_front 4","push_front 5","pop_back",1,10,4]
    print(process_deque(test_cmd))

输出

['ok','ok','2','6','error']
['error','error',1]
['ok','1','10','4']

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...