栈:只有一个操作口,先进后出
队列:两个操作口,一个负责进,另一个负责出,先进先出
这两种数据结构可通过线性表进行存储,即可用顺序表或链表,而对于这两种数据结构主要注重的是对数据的处理方式
以下是对其使用顺序表的实现:
对于栈而言,需要根据存储结构对应的时间复杂度确定栈底和栈顶,
- 存在线性表,插入尾部元素为O(1),头部为O(n),栈顶为尾部
- 存入链接表,插入头部为O(1),尾部为O(n),栈顶为头部
class Stack(object):
#the main function is creat, push, pop, return stack_top,stack_len,is_empty
def __init__(self):
self.__list=[]
def is_empty(self):
return len(self.__list)==0
def push(self,value):
return self.__list.append(value)
#pop操作表示删除元素
def pop(self):
return self.__list.pop()
def peek(self):
if len(self.__list)==0:
return "the stack is empty"
else:
return self.__list[-1]
def stak_len(self):
return len(self.__list)
if __name__=="__main__":
s=Stack()
print(s.is_empty())
s.push(3)
s.push(9)
s.push(7)
s.push(5)
print(s.is_empty())
print(s.peek())
s.pop()
print(s.peek())
print(s.stak_len())
队列在队尾添加,在队头取元素
对于队列而言,使用链表进行操作比线性表更合适,因为涉及到两边的两个操作,用线性表肯定会有一方操作的时间复杂度为O(n),而使用链表时两方的时间复杂度都为O(1)
class Queue(object):
def __init__(self):
self.__list=[]
#the main function is create,enquene,dequeue,is_empty,size
def enquene(self,value):
return self.__list.append(value)
def dequene(self):
return self.__list.pop(0)
def is_empty(self):
return len(self.__list)==0
def size(self):
return len(self.__list)
if __name__=="__main__":
q=Queue()
print(q.is_empty())
q.enquene(3)
q.enquene(5)
q.enquene(10)
print(q.size())
q.dequene()
print(q.size())
还可以进行双端队列