更新時間:2022-12-01 10:25:09 來源:動力節點 瀏覽1415次
推送操作
在 Stack 中添加新節點稱為推送操作。
在鏈表中壓入一個節點與在數組中插入一個元素是完全不同的。使用鏈表實現堆棧推送操作涉及幾個步驟:
首先創建一個節點并為其分配內存。
如果列表為空,則該節點作為鏈表的第一個節點被推送。這個操作給節點的數據部分賦值,給節點的地址部分賦NULL。
如果某些節點已經在鏈表中,那么我們必須在鏈表的開頭添加一個新節點,以免違反 Stack 的屬性。為此,將元素分配給新節點的地址字段并創建一個新節點,該節點將成為列表的起始節點。
如果堆棧已滿,當我們嘗試推送操作時會發生溢出情況。
空推()
{
整數值;
結構節點 *ptr1 = (結構節點*)malloc(sizeof(結構節點));
如果(ptr1 == NULL)
{
print("無法推送節點");
}
別的
{
printf("輸入值");
scanf(“%d”, &值);
如果(開始== NULL)
{
ptr1 -> 值 = 值;
ptr1 -> 下一個 = NULL;
開始= ptr1;
}
別的
{
ptr1 -> 值 = 值;
ptr1 -> next = 開始;
開始= ptr1;
}
print("數據元素被壓入");
}
}
彈出操作
從堆棧中刪除節點稱為彈出操作。
鏈表中的彈出節點不同于數組中的彈出元素。執行彈出操作涉及以下步驟:
在 Stack 中,節點從鏈表的末尾移除。因此,必須刪除存儲在頭指針中的值,并且該節點必須得到釋放。下面的鏈接節點現在將成為頭節點。
當我們嘗試在 Stack 已經為空時彈出操作時,會發生下溢情況。如果列表的頭指針指向 NULL,則 Stack 將毫無意義。
彈出操作
從堆棧中刪除節點稱為彈出操作。
鏈表中的彈出節點不同于數組中的彈出元素。執行彈出操作涉及以下步驟:
在 Stack 中,節點從鏈表的末尾移除。因此,必須刪除存儲在頭指針中的值,并且該節點必須得到釋放。下面的鏈接節點現在將成為頭節點。
當我們嘗試在 Stack 已經為空時彈出操作時,會發生下溢情況。如果列表的頭指針指向 NULL,則 Stack 將毫無意義。
空彈出()
{
整數數據;
結構節點 *ptr1;
如果(開始== NULL)
{
printf(“下溢條件”);
}
別的
{
數據 = 開始 -> 值;
ptr1 = 開始;
開始 = 開始 -> 下一步;
免費(ptr1);
printf("dta 元素彈出");
}
}
空白打印
{
詮釋 x;
結構節點 *ptr1;
ptr1 ==開始;
如果(ptr1 == NULL)
{
printf("空棧");
}
別的
{
printf(“顯示堆棧元素”);
同時(ptr1!= NULL)
{
printf(“%d”, ptr1 -> 值);
ptr1 = ptr1 -> 下一個;
}
}
}
使用鏈表的堆棧實現有一些優點和缺點:
使用鏈表實現堆棧的優點
動態數據結構
鏈表是一種動態數據結構,因此它可以在運行時通過分配和釋放內存來增長和收縮。
插入和刪除
與數組不同,我們不必在插入和刪除內容后移動元素。通過更新節點的下一個指針中存在的地址,鏈表中的插入和刪除相對容易。
沒有內存浪費
在鏈表中,可以在運行時增加和減少大小,從而不會浪費內存。
使用鏈表的堆棧實現的缺點
內存使用情況
需要更多的內存來存儲鏈表中的元素,因為鏈表中的每個節點都包含一個指針,并且它本身需要額外的內存。
遍歷
鏈表中的節點遍歷非常棘手。比如我們要訪問位置n的節點,那么就得遍歷它之前的所有節點。所以訪問一個節點所需的時間很大。
反向移動
使用鏈表在堆棧實現中反向遍歷非常棘手,因為反向指針需要額外的內存,因此會浪費內存。
至此,我們使用鏈表文章完成了堆棧實現。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習