数据结构与算法 | 栈和队列

1 什么是栈

1.1 定义

  • 栈(stack),有些地方称为堆栈,是一种容器可存入数据元素、访问元素、删除元素
  • 特点:只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。
  • 只允许在一端操作!后进先出原理!(LIFO, Last In First Out)
  • 图示:
    在这里插入图片描述
    关于栈的实现,既可以用顺序表也可以用链表,方便起见,使用顺序表,即list来进行实现!

1.2 操作

  • Stack() 创建一个新的空栈
  • push(item) 添加一个新的元素item到栈顶
  • pop() 弹出栈顶元素
  • peek() 返回栈顶元素【元素还在顶部】
  • is_empty() 判断栈是否为空
  • size() 返回栈的元素个数

1.3 Python实现

class Stack(object):
    '''栈'''
    def __init__(self):
        self.__list = [] # 容器
        # 确定头部还是尾部开始加入元素
    
    def push(self, item):
        '''添加一个新的元素item到栈顶'''
        return self.__list.append(item) # 顺序表的时候 使用尾部添加时间复杂度更低 如果是链表 则头部插入删除 时间复杂度低
    
    def pop(self):
        '''弹出栈顶元素'''
        return self.__list.pop()
    
    def peek(self):
        '''返回栈顶元素【元素还在顶部】'''
        if self.__list:
            return self.__list[-1]
        else:
            return None
    
    def is_empty():
        '''判断栈是否为空'''
        return self.__list == []
    # return not self.__list 
    
    def size():
        '''返回栈的元素个数'''
        return len(self.__list)
     

1.4 实例

if __name__ == "__main__":
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())
4
3
2
1

符合后进先出!

2 什么是队列

2.1 定义

  • 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
  • 队列是一种先进先出的(First In First Out)的线性表,简称FIFO。
  • 允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!
  • 假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。删除从a1开始,插入从队列最后an插。
  • 符合生活习惯,排在第一个的优先出列,最后来的当然排在队伍最后。
  • 图示:
    在这里插入图片描述

2.2 变形拓展

  • 除了上述普通的队列之外,还有一种队列方式是双端队列
  • 定义:双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构
  • 特点:双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队
  • 图示:可以看到把另一端堵起来那就是了!左开push又开pop或者左开pop右开push就是普通队列!两端都开着就是双端队列
    在这里插入图片描述

2.3 普通队列Python实现

2.3.1 操作

  • Queue() 创建一个空的队列
  • enqueue(item) 往队列中添加一个item元素
  • dequeue() 从队列头部删除一个元素
  • is_empty() 判断一个队列是否为空
  • size() 返回队列的大小

2.3.2 Python实现

class Queue(object):
    '''队列'''
    # 先创造一个容器出来 存储数据
    def __init__(self):
        self.__list = [] # 空列表来存储队列数据
    
    def enqueue(self,item):
        '''往队列中添加一个item元素'''
        return self.__list.append(item)
#         self.__list.insert(0,item)
    def dequeue(self):
        '''从队列头部删除一个元素'''
#       return self.__list.pop()
        return self.__list.pop(0)
    
    def is_empty(self):
        '''判断一个队列是否为空'''
        return self.__list == []
    
    def size(self):
        '''返回队列的大小'''
        return len(self.__list)
    
    

2.3.3 实例

if __name__ == "__main__":
    s = Queue()
    s.enqueue(1)
    s.enqueue(2)
    s.enqueue(3)
    s.enqueue(4)
    print(s.dequeue())
    print(s.dequeue())
    print(s.dequeue())
    print(s.dequeue())
1
2
3
4

符合先进先出!

2.4 双端队列Python实现

2.4.1 操作

  • Deque() 创建一个空的双端队列
  • add_front(item) 从队头加入一个item元素
  • add_rear(item) 从队尾加入一个item元素
  • remove_front() 从队头删除一个item元素
  • remove_rear() 从队尾删除一个item元素
  • is_empty() 判断双端队列是否为空
  • size() 返回队列的大小

2.4.2 Python实现

class Deque(object):
    '''双端队列'''
    # 先创造一个容器出来 存储数据
    def __init__(self):
        self.__list = [] # 空列表来存储队列数据
    
    def add_front(self,item):
        '''从队头加入一个item元素'''
        self.__list.insert(0,item)
#         self.__list.insert(0,item)

    def add_rear(self,item):
        '''从队尾加入一个item元素'''
        self.__list.append(item)
        
    def remove_front(self):
        '''从队头删除一个item元素'''
#       return self.__list.pop()
        return self.__list.pop(0)

    def remove_rear(self):
        '''从队尾删除一个item元素'''
#       return self.__list.pop()
        return self.__list.pop()
    
    def is_empty(self):
        '''判断一个队列是否为空'''
        return self.__list == []
    
    def size(self):
        '''返回队列的大小'''
        return len(self.__list)

2.4.3 实例

if __name__ == "__main__":
    s = Deque()
    s.add_front(1)
    s.add_front(2)
    s.add_rear(3)
    s.add_rear(4) 
    # 此时s=[2,1,3,4]
    print(s.size())
    print(s.is_empty())
    
    print(s.remove_front()) # 2
    print(s.remove_front()) # 1
    print(s.remove_rear()) # 4
    print(s.remove_rear()) # 3 
    
    print(s.size())
    print(s.is_empty())
4
False
2
1
4
3
0
True

参考

猜你喜欢

转载自blog.csdn.net/qq_27782503/article/details/94546179