首頁 > 軟體

C++詳解鏈棧的實現

2022-06-25 14:02:52

鏈棧簡述

鏈棧從概念上看是連結串列和棧的結合,含有棧先進後出的特性,也具有連結串列的動態增加節點的特性,這裡相當於在連結串列的基礎上增加只能從一端操作,且保持先進後出的特性。將頭節點所在的那端看作棧頂,頭節點後緊接著的節點所在的位置,即第一個儲存資料的節點所在的位置為出棧入棧的位置。

範例程式碼

直接上程式碼:

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++鏈棧內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com