首頁常見問題正文

隊列和棧是什么?有什么區(qū)別?

更新時間:2023-03-28 來源:黑馬程序員 瀏覽量:

IT培訓班

  隊列和棧是常見的數據結構,它們都用于存儲和管理數據,但是它們在存儲和訪問數據的方式上有所不同。

  隊列是一種先進先出(FIFO)的數據結構,類似于排隊。新的元素被添加到隊列的尾部,而從隊列中刪除元素時,總是刪除隊列頭部的元素。隊列的常見操作包括入隊(enqueue)和出隊(dequeue)。

  棧是一種后進先出(LIFO)的數據結構,類似于一摞書。新的元素被添加到棧的頂部,而從棧中刪除元素時,總是刪除棧頂的元素。棧的常見操作包括入棧(push)和出棧(pop)。

  我們用一段Python代碼來加以說明:

# 隊列的實現
class Queue:
    def __init__(self):
        self.items = []
        
    def enqueue(self, item):
        self.items.append(item)
        
    def dequeue(self):
        if self.is_empty():
            return None
        return self.items.pop(0)
    
    def is_empty(self):
        return len(self.items) == 0
    
    def size(self):
        return len(self.items)

# 棧的實現
class Stack:
    def __init__(self):
        self.items = []
        
    def push(self, item):
        self.items.append(item)
        
    def pop(self):
        if self.is_empty():
            return None
        return self.items.pop()
    
    def is_empty(self):
        return len(self.items) == 0
    
    def size(self):
        return len(self.items)

  在上面的代碼中,我們使用Python的列表來實現隊列和棧。在隊列中,我們使用append()方法將元素添加到列表的尾部,并使用pop(0)方法從列表的頭部刪除元素。在棧中,我們使用append()方法將元素添加到列表的末尾,并使用pop()方法從列表的末尾刪除元素。

  以下是使用隊列和棧的示例代碼:

# 使用隊列實現廣度優(yōu)先搜索
def bfs(graph, start):
    visited = set()
    queue = Queue()
    queue.enqueue(start)

    while not queue.is_empty():
        vertex = queue.dequeue()
        if vertex not in visited:
            visited.add(vertex)
            for neighbor in graph[vertex]:
                queue.enqueue(neighbor)
    return visited

# 使用棧實現深度優(yōu)先搜索
def dfs(graph, start):
    visited = set()
    stack = Stack()
    stack.push(start)

    while not stack.is_empty():
        vertex = stack.pop()
        if vertex not in visited:
            visited.add(vertex)
            for neighbor in graph[vertex]:
                stack.push(neighbor)
    return visited

  在上面的代碼中,我們使用隊列實現了廣度優(yōu)先搜索(BFS),并使用棧實現了深度優(yōu)先搜索(DFS)。BFS和DFS是圖論中常見的搜索算法,它們可以用來解決許多問題,例如尋找最短路徑或拓撲排序等。

分享到:
在線咨詢 我要報名
和我們在線交談!