题目
描述
请你实现一个循环队列,该循环队列可利用的空间大小等于n个int型变量的大小。
操作:
push x:将xxx加入到循环队列尾端。若循环队列已满,输出"full"(不含引号),否则不输出任何内容。保证xxx为int型整数。
front:输出队首元素,队首不出队。若队列为空,输出"empty"(不含引号)。
pop:输出队首元素,且队首出队。若队列为空,输出"empty"(不含引号)。
输入描述:
第一行输入两个整数n, q (1≤n, q≤10^5),表示循环队列可利用的空间大小和操作次数。
接下来的q行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。
输出描述:
按对应操作要求输出。
示例
输入:
3 10
push 1
push 2
front
push 3
push 4
pop
pop
pop
front
pop
输出:
1
full
1
2
3
empty
empty
代码
class Queue:
def __init__(self,size):
# 以列表的最后一个元素作为队尾
self.items = [None]*size #长度占位 声明长度为size的数据区
self.size =size #队列的最大长度
self.head = 0 #队头的索引
self._length = 0 #记录队列的长度
def is_empty(self):
return self._length ==0 # items中实际是有元素的,没有真正pop,但是进行了封装
def length(self):
return self._length
def push(self, item):
if self.length() == self.size:
print("full" )
else:
idx = (self.head + self.length()) % self.size #要加入元素的索引
self.items[idx] = item #赋值
self._length += 1
def pop(self):
# 抛出队首元素
if self.is_empty():
return "empty"
else:
value = self.items[self.head]
self.head = (self.head +1) % self.size #出队之后的队头索引
self._length -= 1
return value#时间复杂度为O(1)
def front(self):
if self.is_empty():
return "empty"
return self.items[self.head]
if __name__ == "__main__":
m, n = map(int, input().split())
queue = Queue(m)
while n:
n = n - 1
s = input('') # 在pycharm中改为s = input(' ') 牛客中为s = input('')
a = s.split()[0]
if a == "push":
num = int(s.split()[1])
queue.push(num)
elif a == "pop":
print(queue.pop())
else:
print(queue.front())