對於堆疊資料結構,堆疊入和堆疊出是兩個基本操作。 在電腦科學中,堆疊通常用於處理函式呼叫、表示式求值、括號匹配等。
棧定義
堆疊是一種基本資料結構,它以後進先出 (lifo) 的方式管理資料。 堆疊可以被認為是元素的集合,這些元素只能在堆疊的一端(通常稱為頂部)插入和刪除。 堆疊的另一端稱為底部。 在堆疊中,插入的最後乙個元素是第乙個要刪除的元素,該功能為堆疊提供特定順序。
棧抽象資料型別
堆疊可以抽象為資料型別,稱為堆疊的抽象資料型別 (ADT)。 ADT 定義了堆疊的基本操作,包括將元素推入堆疊(push)、離開堆疊(pop)和獲取堆疊的頂部元素(top)。 這種抽象定義使堆疊在實現和使用上更加靈活,並且可以應用於不同的程式語言。
棧基本特徵
後進先出 (LIFO):堆疊遵循後進先出原則,首先刪除最後插入的元素。
僅在在堆疊頂部繼續插入和刪除操作:插入和刪除元素只能在堆疊的頂部完成,並且只有在清空整個堆疊時才能訪問堆疊底部的元素。
常見於遞迴呼叫和函式呼叫:堆疊的性質使其廣泛用於遞迴和函式呼叫。
棧實現
堆疊有兩種主要實現:基於陣列的順序堆疊和基於鍊表的鏈堆疊。
基於陣列的順序棧
順序堆疊使用陣列作為基礎資料結構,通過維護堆疊指標的頂部來標識堆疊頂部元素的位置。 在陣列的末尾,對元素執行堆疊和堆疊操作,包括:
到棧(push):將新元素插入堆疊的頂部,並更新堆疊指標的頂部。
外棧(pop):刪除堆疊元素的頂部並更新堆疊指標的頂部。
獲取棧頂部元素:返回堆疊指標頂部位置處的元素的值。
基於陣列的順序堆疊實現簡單高效,但其容量需要在初始化時確定,並且不容易動態擴充套件。
基於鍊表的鏈結棧
鏈式堆疊使用鍊表來儲存元素,每個節點包含乙個資料元素和乙個指向下乙個節點的指標。 鏈式堆疊比順序堆疊更靈活,可以動態分配和釋放記憶體,而不受容量限制。 鏈式堆疊的操作包括:
到棧(push):在鍊表的頂部插入乙個新節點,成為堆疊的新頂部。
外棧(pop):刪除鍊表標頭節點並更新頂部堆疊指標。
獲取棧頂部元素:返回鍊表頂部節點的元素值。
鏈式堆疊適用於動態記憶體分配,但可能比順序堆疊占用更多的記憶體空間。
在堆疊資料結構中,基本操作主要包括推入堆疊、離開堆疊(pop)、獲取頂部元素(top)。 這些操作是堆疊實現和應用程式的核心,下面將詳細討論這些操作以及如何實現這些操作。
到棧操作
堆疊操作是指將新元素新增到堆疊的頂部,使其成為堆疊的新頂部元素。 此過程涉及更新堆疊頂部指標,使其指向新插入的元素。 進入堆疊的步驟如下:
判斷堆疊是否已滿(對於基於陣列的順序堆疊)。
如果堆疊未滿,請將新元素放在堆疊的頂部。
更新堆疊頂部指標以指向新插入的元素。
基於陣列的順序棧之棧實現
對於基於陣列的順序堆疊,堆疊的實現相對簡單。 下面是乙個簡化的堆疊實現示例(在 Python 中):
class arraystack:
def __init__(self, capacity):
self.capacity = capacity
self.stack = [none] *capacity
self.top = -1 將堆疊指標的頂部初始化為 -1
def is_full(self):
return self.top == self.capacity - 1
def push(self, item):
if not self.is_full():
self.top += 1
self.stack[self.top] = item
print(f"堆疊成功")
else:print("堆疊已滿,堆疊入口失敗")
例。 stack = arraystack(5)
stack.push(1) 1 被成功放入堆疊中。
stack.push(2) 2 堆疊成功。
stack.push(3) 3 堆疊成功。
stack.push(4) 4 堆疊輸入成功。
stack.push(5) 5 成功傳入。
stack.push(6) 堆疊已滿, 堆疊入口失敗。
基於鍊表的鏈結棧之棧實現
對於基於鍊表的鏈棧,棧上的實現同樣直觀。 下面是乙個簡化的鏈式堆疊實現到堆疊的示例:
class node:
def __init__(self, data=none):
self.data = data
self.next = none
class linkedstack:
def __init__(self):
self.top = none 將頂部堆疊指標初始化為空。
def push(self, item):
new_node = node(item)
new_node.next = self.top
self.top = new_node
print(f"堆疊成功")
例。 linked_stack = linkedstack()
linked_stack.push(1) 1 被成功放入堆疊中。
linked_stack.push(2) 2 堆疊成功。
linked_stack.push(3) 3 堆疊成功。
棧上操作的實現可以適應特定的程式語言和實際需求,但核心思想是在棧的頂部新增新的元素,並更新棧指標的頂部。
外棧操作
堆疊外操作是指從堆疊頂部刪除元素,使其不再是堆疊的一部分。 此過程還涉及更新堆疊指標的頂部,使其指向新的頂部元素。 e-stack操作的步驟如下:
確定堆疊是否為空。
如果堆疊不為空,請刪除堆疊的頂部元素。
更新堆疊指標的頂部,使其指向堆疊元素的新頂部。
基於陣列的順序棧外棧實現
對於基於陣列的順序堆疊,堆疊的實現也相對直觀。 下面是乙個簡化的堆疊外實現示例:
class arraystack:
# ..省略了前面的定義)。
def is_empty(self):
return self.top == -1
def pop(self):
if not self.is_empty():
item = self.stack[self.top]
self.top -= 1
print(f"堆疊成功")
return item
else:print("堆疊為空,堆疊退出失敗")
例。 stack = arraystack(5)
stack.push(1)
stack.push(2)
stack.pop() 2 已成功從堆疊中退出。
stack.pop() 1 已成功從堆疊中退出。
stack.pop() 堆疊為空,並且出口堆疊失敗。
基於鍊表的鏈結棧外棧實現
對於基於鍊表的鏈棧,電子棧的實現同樣直觀。 下面是乙個簡化的鏈式堆疊實現示例:
class linkedstack:
# ..省略了前面的定義)。
def is_empty(self):
return self.top is none
def pop(self):
if not self.is_empty():
item = self.top.data
self.top = self.top.next
print(f"堆疊成功")
return item
else:print("堆疊為空,堆疊退出失敗")
例。 linked_stack = linkedstack()
linked_stack.push(1)
linked_stack.push(2)
linked_stack.pop() 2 已成功從堆疊中退出。
linked_stack.pop() 1 已成功從堆疊中退出。
linked_stack.pop() 堆疊為空,並且出口堆疊失敗。
堆疊外操作也需要適應特定的程式語言和實際需求,但核心思想是從堆疊頂部刪除乙個元素並更新堆疊指標的頂部。
獲取棧頂部元素
獲取堆疊頂部元素是一種查詢操作,它返回堆疊當前頂部的元素值,但不會將其移出堆疊。 這可以幫助我們了解堆疊的當前狀態。
基於陣列的順序棧收購數量棧頂級元素實現
對於基於陣列的順序堆疊,獲取堆疊頂部元素的實現也很簡單。 下面是乙個簡化實現的示例:
class arraystack:
# ..省略了前面的定義)。
def get_top(self):
if not self.is_empty():
item = self.stack[self.top]
print(f"堆疊的當前頂部元素是")
return item
else:print("堆疊為空,無法獲取堆疊的頂部元素")
例。 stack = arraystack(5)
stack.push(1)
stack.push(2)
stack.對於堆疊的 top 元素,get top() 當前為 2
stack.pop()
stack.get top() 當前在堆疊頂部為 1
基於鍊表的鏈結棧收購數量棧頂級元素實現
對於基於鍊表的鏈式堆疊,獲取堆疊頂部元素的實現同樣簡單。 下面是乙個簡化實現的示例:
class linkedstack:
# ..省略了前面的定義)。
def get_top(self):
if not self.is_empty():
item = self.top.data
print(f"堆疊的當前頂部元素是")
return item
else:print("堆疊為空,無法獲取堆疊的頂部元素")
例。 linked_stack = linkedstack()
linked_stack.push(1)
linked_stack.push(2)
linked_stack.對於堆疊的 top 元素,get top() 當前為 2
linked_stack.pop()
linked_stack.get top() 當前在堆疊頂部為 1
Get Top Stack Element 操作可以幫助我們了解當前堆疊中發生的情況,但它不會影響堆疊中元素的實際結構。