python - 循环缓冲区Python实现

标签 python circular-buffer

我为面试问题编写了循环缓冲区的代码。但事实上,两个测试用例通过了,而其他测试用例则失败了。失败原因:索引超出f范围。之后我尝试了几个测试用例来重现失败。不幸的是,他们都没有重现该错误。这是代码。

Implement a circular buffer of size N. Allow the caller to append, remove and list the contents of the buffer. Implement the buffer to achieve maximum performance for each of the operations.

"A" n - Append the following n lines to the buffer. If the buffer is full they replace the older entries.
"R" n - Remove first n elements of the buffer. These n elements are the ones that were added earliest among the current elements.
"L" - List the elements of buffer in order of their inserting time.
"Q" - Quit.

class circbuffer():

    #initialization
    def __init__(self,size):
            self.maximum=size
            self.data=[]
            self.current=0


    #appending when the buffer is not full
    def append(self,x):
            if len(self.data)==self.maximum:
                    self.current=0
                    self.data[self.current]=x
                    self.current=(self.current+1)%self.maximum
                    self.__class__=bufferfull
            else:
                    self.data.append(x)

    def remove(self,x):
            if self.data:
                    self.data.pop(0)

    def cget(self):
            return self.data

class bufferfull:

    def append(self,x):
            if len(self.data)<self.maximum:
                    self.data.insert(self.current, x)
            else:
                    self.data[self.current]=x
            self.current=(self.current+1)%self.maximum

    def remove(self,x):
            if self.data:
                    if self.current>len(self.data):
                            self.current=0
                    self.data.pop(self.current)

    def cget(self):
            return self.data[self.current:]+self.data[:self.current]
n=input()

buf=circbuffer(n)
outputbuf=[]

while True:
    com=raw_input().split(' ')
    if com[0]=='A':
            n=int(com[1])
            cominput=[]
            for i in xrange(n):
                    cominput.append(raw_input())
            for j in cominput:
                    buf.append(j)
    elif com[0]=="R":
            n=int(com[1])
            for i in range(n):
                    buf.remove(i)
    elif com[0]=="L":
            for i in buf.cget():
                    outputbuf.append(i)
    elif com[0]=="Q":
            break

for i in outputbuf:
    print i

错误指向bufferfull类中的self.data.pop(self.current)。我无法从采访街头人士那里得到测试数据。我正在尝试自己提出测试用例来重现该错误。

有什么见解吗?

最佳答案

这里有一个错误:

def remove(self,x):
        if self.data:
                if self.current>len(self.data):
                        self.current=0
                self.data.pop(self.current)

如果self.current == len(self.data),您将尝试弹出一个不存在的元素。

作为一般性评论,您的实现过于复杂,因此在我的书中得分不会很高(其他人可能会以不同的方式看待这一点)。 @9000 对你的问题的评论很好地总结了这一点:

Keep it simple. Don't be clever when you can be straightforward in the same number of lines. All you need is a head pointer, a tail pointer, and a list of a fixed size. You don't need any fancy metaprogramming stuff whatsoever. – @9000

关于python - 循环缓冲区Python实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433910/

相关文章:

python - 使用 Sikuli 验证文本

python - Crontab 使用错误版本的 Python 运行脚本

javascript - 如何在 JavaScript 中以循环方式访问数组

mysql - 使用 SQL 的循环缓冲区

python - view.py 中的问题 : message error Invalid literal for int() with base 10

python - 我怎样才能使用 Django 做一种不同的事情

python - 递归函数值生成器的多重处理

c++ - C++ 中的通用循环缓冲区实现

python - 带有 numpy/ctypes 的环形缓冲区

java - Java中的线程安全循环缓冲区