編程日志4.24

棧的鏈表基礎表示結構

#include<iostream>
#include<stdexcept>

using namespace std;
//模板聲明,表明Stack類是一個通用的模板,可以用于存儲任何類型的元素T
template<typename T>

//棧的聲明
//Stack類的聲明,表示一個棧的數據結構
class Stack {
private://定義私有(成員變量)
?? ?struct Node {//結構體定義,用于表示棧中的結點,每個結點包含一個數據成員data和一個指向下一個結點的指針next
?? ??? ?T data;
?? ??? ?Node* next;
?? ??? ?Node(T d):data(d),next(NULL){}
?? ?};
?? ?Node* head;//用于保存棧的頭結點指針
?? ?int size;//用于保存棧的大小
?? ?
public://定義公共
?? ?Stack() : head(NULL),size(0){}//構造函數,用于初始化棧,它將頭結點指針設置為NULL,并將棧的大小設置為0
?? ?~Stack();//析構函數,用于釋放棧所用的內存
?? ?void push(T element);//公共函數,用于將一個新元素壓入棧頂
?? ?T pop();//用于從棧頂彈出一個元素
?? ?T top() const;//用于獲取棧頂的元素,但不彈出它
?? ?int getSize() const;//用于獲取棧中元素數量
};

//棧的擴容
//有鏈表實現棧時,每次如果是新生成的結點,則不涉及到像順序表那樣的擴容操作

//棧的銷毀
template<typename T>
Stack<T>::~Stack() {//析構函數的聲明,用于在對象銷毀時,釋放動態分配的結點內存
//不斷循環訪問棧中的元素,每次取出棧頂元素,存儲到臨時變量temp中,并且彈出棧頂,并利用delete將彈出的元素進行內存釋放,知道棧為空為止
?? ?while (head != NULL) {
?? ??? ?Node* temp = head;
?? ??? ?head = head->next;
?? ??? ?delete temp;
?? ?}
}

//入棧
template<typename T>
void Stack<T>::push(T element) {
//創建了一個新的Node對象,并將傳入的元素賦值給該對象的數據成員。通過使用new操作符動態分配了內存來存儲新的結點
?? ?Node* newNode = new Node(element);
?? ?newNode->next = head;//將新節點的next指針指向當前的頭結點。這樣,新節點就被添加到了棧的頭部
?? ?head = newNode;//將頭節點的指針更新為新節點,使新節點成為棧的新頭部
?? ?++size;//棧大小+1
}

//出棧
template<typename T>
T Stack<T>::pop() {
?? ?if (head == NULL) {
?? ??? ?throw std::underflow_error("Stack is empty");//如果棧空,拋出異常
?? ?}
?? ?T result = head->data;//將頭結點的數據成員賦值給result變量,準備返回彈出的元素
?? ?Node* temp = head;//將頭結點的指針賦值給temp變量,用于后續刪除頭結點
?? ?head = head->next;//將頭結點的next指針賦值給頭結點本身,從而將頭結點從鏈表中移除
?? ?delete temp;//調用delete釋放temp所指向的結點內存
?? ?--size;//棧大小-1
?? ?return result;//返回彈出的元素
}

//獲取棧頂元素
template<typename T>
T Stack<T>::top() const {
?? ?if (head == NULL) {
?? ??? ?throw std::underflow_error("Stack is empty");//如果棧空,拋出異常
?? ?}
?? ?return head->data;//不空,返回head的data域,即棧頂元素。
}

template<typename T>
int Stack<T>::getSize() const{
?? ?return size;
}

int main() {
?? ?Stack<int> st;
?? ?st.push(4);
?? ?st.push(7);
?? ?st.push(13);
?? ?cout << st.top() << endl;
?? ?st.push(17);
?? ?cout << st.top() << endl;
?? ?st.pop();
?? ?st.pop();
?? ?cout << st.top() << endl;
?? ?cout << st.getSize() << endl;

?? ?return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《冰雪傳奇點卡版》:探索冰雪世界的傳奇旅程!

《冰雪傳奇點卡版》以“純凈打金”為核心&#xff0c;摒棄復雜付費坑&#xff0c;回歸經典傳奇玩法。以下從核心玩法、資源獲取、職業搭配、交易變現四維度展開&#xff0c;助你高效開啟冰雪傳奇之旅。 一、核玩法解析&#xff1a;如何高效獲取資源&#xff1f; 1. 職業定位與…

DeepClaude開源程序可以實現代碼生成、創作詩句以及內容創作等功能

一、軟件介紹 文末提供程序和源碼下載 DeepClaude開源程序是增強的 AI&#xff0c;可以實現代碼生成&#xff1a;DeepSeek r1 Claude 3.7 十四行詩 - 無與倫比的性能&#xff01;內容創作&#xff1a;DeepSeek r1 Gemini 2.5 Pro - 卓越的質量&#xff01;OpenAI 兼容。流媒…

Java常用注解通俗解釋

注解就像是給Java代碼貼的"便利貼"&#xff0c;它們不會改變代碼本身的邏輯&#xff0c;但能給編譯器、開發工具或運行時環境提供額外信息。下面我用最通俗的方式解釋Java中最常用的注解&#xff1a; 一、基礎篇&#xff1a;人人必知的注解 1. Override - "我…

vscode chrome調試怎么在所有瀏覽器都好使

chrome調試時只能在打開的瀏覽器里進行調試&#xff0c;其它打開的chrome瀏覽器就不能調試了&#xff0c;怎么解決。 右鍵點擊 Chrome 的快捷方式圖標&#xff0c;選擇屬性 在目標一欄&#xff0c;最后加上--remote-debugging-port9222 注意要用空格隔開 lanch.json 文件配置 …

Unity PBR基礎知識

PBR原理 基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理論建模的著色/光照模型&#xff0c;以及使用從現實中測量的表面參數來準確表示真實世界材質的渲染理念。 PBR基礎理念 微平面理論&#xff08;Micr…

COM組件使用方法

普通COM組件&#xff08;如DLL&#xff09;僅暴露方法/屬性接口&#xff0c;而ActiveX控件&#xff08;如OCX&#xff09;需要可視化交互&#xff08;如按鈕、表格&#xff09;&#xff0c;需通過 ??AxInterop?? 包裝器實現宿主環境集成。 項目中引入ActiveX控件流程如下。…

在 Spring Boot 項目中如何使用索引來優化 SQL 查詢?

在 Spring Boot 項目中使用索引來優化 SQL 查詢是提升數據庫性能最常用的方法之一。下面是詳細的步驟和實踐指南&#xff1a; 核心目標&#xff1a;讓數據庫能夠通過掃描索引&#xff08;小范圍、有序的數據結構&#xff09;快速定位到所需數據行&#xff0c;而不是掃描整個表…

Vue3生產環境與Vue Devtools

在 Vue 3 的生產環境中&#xff0c;默認情況下 Vue Devtools 是無法正常使用 的&#xff0c;但開發者可以通過配置強制啟用。以下是關鍵信息總結&#xff1a; &#x1f4cc; 核心結論 默認不可用 Vue 3 生產構建會移除 Devtools 支持以優化性能和安全性。 可強制啟用 通過構建…

ARP滲透學習1

ARP協議工作原理 1. 什么是ARP ARP定義: 地址解析協議&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根據IP地址獲取物理地址的一個TCP/IP協議。 2. 工作原理 ARP表: 每臺計算機都需要一個ARP表&#xff0c;用來保存IP地址和MAC地址的映射關系。查詢過…

甲骨文云2025深度解析:AI驅動的云原生生態與全球化突圍

一、戰略轉型&#xff1a;從數據庫巨頭到AI云服務先鋒 1. 技術重心向AI與云深度遷移 甲骨文在2025年加速向AI原生云架構轉型&#xff0c;其核心戰略圍繞生成式AI與量子計算展開。通過推出Oracle 23ai自治數據庫&#xff0c;深度集成AI向量搜索功能&#xff0c;并重構云基礎設…

【網絡原理】TCP異常處理(二):連接異常

目錄 一. 由進程崩潰引起的連接斷開 二. 由關機引起的連接斷開 三. 由斷電引起的連接斷開 四. 由網線斷開引起的連接斷開 一. 由進程崩潰引起的連接斷開 在一般情況下&#xff0c;進程無論是正常結束&#xff0c;還是異常崩潰&#xff0c;都會觸發回收文件資源&#xff0c;…

想做博聞強記的自己

2025年4月29日&#xff0c;13~25℃&#xff0c;還好 待辦&#xff1a; 冶金《物理》期末測試 閱卷&#xff08;冶金《物理》期末測試試卷&#xff09; 重修《物理》《物理2》電子材料歸檔 規則變更&#xff0c;《高等數學2》期末試卷推倒重來 遇見&#xff1a;直播畫面。 感受…

IP屬地是實時位置還是自己設置

刷微博、抖音時&#xff0c;評論區總能看到“IP屬地”&#xff1f;這個突然冒出來的小標簽&#xff0c;讓不少網友摸不著頭腦&#xff1a;?IP屬地是實時位置&#xff0c;還是可以自己設置&#xff1f;?別急&#xff0c;今天咱們就來聊聊這個話題&#xff01; 1、什么是IP屬地…

水力壓裂多裂縫擴展誘發光纖應變演化試驗研究

1.概述 本文基于OFDR技術的光纖應變監測方法&#xff0c;監測了真三軸條件下人造巖石試樣與頁巖的水力壓裂試驗。結果表明&#xff0c;OFDR技術能以毫米級分辨率實時監測裂縫起裂、擴展及閉合全過程&#xff0c;并建立基于應變演化的裂縫判別準則&#xff0c;為光纖壓裂監測的…

4、RabbitMQ的七種工作模式介紹

目錄 一、Simple(簡單模式) 1.1 概念 1.2 代碼實現 消費者 運行結果 二、Work Queue&#xff08;工作隊列&#xff09; 2.1 概念 1.2 代碼實現 生產者 消費者 運行結果 三、Publish/Subscribe&#xff08;發布/訂閱模式&#xff09; 3.1 概念 3.2 代碼實現 生產者…

厚銅PCB鉆孔工藝全解析:從參數設置到孔壁質量的關鍵控制點

在現代電子設備中&#xff0c;厚銅PCB&#xff08;印刷電路板&#xff09;扮演著至關重要的角色。它們不僅為電子元件提供了支撐&#xff0c;還實現了電路之間的連接。然而&#xff0c;在生產厚銅PCB時&#xff0c;鉆孔是一個關鍵環節。本文將為您介紹厚銅PCB生產中鉆孔的科普知…

缺口拼圖,非線性坐標關聯

繼上一篇文章&#xff0c; 歡迎一起交流探討 https://t.zsxq.com/GEIze

OTA(Over-The-Air)升級

簡介&#xff1a; OTA&#xff08;Over-the-Air&#xff09;是一種通過無線方式進行數據傳輸和更新的技術&#xff0c;通常用于電子設備&#xff08;如智能手機、汽車、物聯網設備等&#xff09;的軟件、固件或配置更新。OTA可以在設備與服務器之間進行遠程傳輸&#xff0c;用戶…

fastapi和flaskapi有什么區別

FastAPI 和 Flask 都是 Python 的 Web 框架&#xff0c;但設計目標和功能特性有顯著差異。以下是它們的核心區別&#xff1a; 1. ?性能與異步支持? ?FastAPI? 基于 ?Starlette?&#xff08;高性能異步框架&#xff09;和 ?Pydantic?&#xff08;數據校驗庫&#xff09;…

RCS認證是什么?RCS認證的好處?RCS認證所需要的資料

1. RCS&#xff08;Recycled Claim Standard&#xff09;認證 定義&#xff1a;由 Textile Exchange&#xff08;紡織品交易所&#xff09; 制定的國際標準&#xff0c;用于驗證產品中回收材料&#xff08;如再生纖維、塑料、金屬等&#xff09;的含量和供應鏈的可追溯性&…