C++詳解鏈棧的實現
鏈棧簡述
鏈棧從概念上看是鏈表和棧的結合,含有棧先進後出的特性,也具有鏈表的動態增加節點的特性,這裡相當於在鏈表的基礎上增加隻能從一端操作,且保持先進後出的特性。將頭節點所在的那端看作棧頂,頭節點後緊接著的節點所在的位置,即第一個存儲數據的節點所在的位置為出棧入棧的位置。
示例代碼
直接上代碼:
LinkStack.h
#pragma once typedef struct LINKNODE { struct LINKNODE *pNext; }LinkNode; class LinkStack { public: LinkStack(); ~LinkStack(); void pushLinkStack(LinkNode *data); void popLinkStack(); LinkNode *getTopLinkStack(); int getSizeLinkStack(); void clearStack(); private: //這裡可以不定義該類類型的指針,該類類型變量定義後隻能使用單獨的初始化函數初始化, //不能用構造函數,會造成循環調用構造函數的死循環中 // LinkStack *m_LinkStack; LinkNode m_head; int m_size; };
LinkStack.cpp
#include "LinkStack.h" LinkStack::LinkStack() { m_size = 0; } LinkStack::~LinkStack() { } void LinkStack::pushLinkStack(LinkNode * data) { if (data == nullptr) { return; } data->pNext = m_head.pNext; m_head.pNext = data; m_size++; } void LinkStack::popLinkStack() { LinkNode *pDel = m_head.pNext; m_head.pNext = pDel->pNext; m_size--; } LinkNode * LinkStack::getTopLinkStack() { return m_head.pNext; } int LinkStack::getSizeLinkStack() { return m_size; } void LinkStack::clearStack() { m_head.pNext = nullptr; m_size = 0; }
main.cpp
#include <iostream> #include "LinkStack.h" using namespace std; typedef struct PERSON { LinkNode node; char name[64]; int age; }Person; void test() { LinkStack *pLinkStack = new LinkStack; Person p1, p2, p3,p4,p5; strcpy_s(p1.name,"hudh"); strcpy_s(p2.name,"呼呼"); strcpy_s(p3.name,"jidi"); strcpy_s(p4.name, "hus"); strcpy_s(p5.name, "akios"); p1.age = 34; p2.age = 45; p3.age = 67; p4.age = 67; p5.age = 78; pLinkStack->pushLinkStack((LinkNode*)&p1); pLinkStack->pushLinkStack((LinkNode*)&p2); pLinkStack->pushLinkStack((LinkNode*)&p3); pLinkStack->pushLinkStack((LinkNode*)&p4); pLinkStack->pushLinkStack((LinkNode*)&p5); while (pLinkStack->getSizeLinkStack() > 0) { Person *pData = (Person*)pLinkStack->getTopLinkStack(); cout << "name: " << pData->name << " age:" << pData->age << endl; pLinkStack->popLinkStack(); } delete pLinkStack; pLinkStack = nullptr; } int main() { test(); return 0; } // 運行程序: Ctrl + F5 或調試 >“開始執行(不調試)”菜單 // 調試程序: F5 或調試 >“開始調試”菜單 // 入門使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團隊資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯誤列表窗口查看錯誤 // 5. 轉到“項目”>“添加新項”以創建新的代碼文件,或轉到“項目”>“添加現有項”以將現有代碼文件添加到項目 // 6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”並選擇 .sln 文件
開發環境
vs2017 控制臺輸出程序。
運行結果
註意
棧是連續的存儲空間,故而在數量上會受到限制,而鏈棧打破瞭棧的內存空間的連續性,擴展性更強。
到此這篇關於C++詳解鏈棧的實現的文章就介紹到這瞭,更多相關C++鏈棧內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!