數據結構 - C/C++ - 棧

目錄

結構特性

結構實現

結構容器

結構設計

順序棧

鏈式棧


結構特性

  • 棧(stack)是線性表的一種形式,限定僅在表的一端進行插入或者刪除的操作。

  • 棧頂 - 表中允許插入、刪除的一端稱為棧頂(top),棧頂位置是可以發生變化的。

    • 插入 - 進棧、入棧、壓棧。

    • 刪除 - 出棧。

  • 棧底 - 表中不允許插入、刪除的一端稱為棧底(bottom),棧底位置通常是固定不變的。

  • 空棧 - 表中不存在任何元素。

  • LIFO - last in first out - 先進后出、后進先出。

結構實現

  • 順序棧
int Arr[5] = {0};[棧頂] - Arr[4]
[元素] - Arr[x]
[元素] - Arr[x]
[元素] - Arr[x]
[棧底] - Arr[0] 
  • 順序棧使用連續的內存空間來存儲元素,通常使用數組來實現。

  • 棧底指向數組起始地址(下標為0的元素)。

  • 棧頂指向當前棧中最后一個壓入的元素位置。

  • 鏈式棧

[棧頂元素 | 指針] -> [下一個元素 | 指針] -> ... -> [棧底元素 | 空指針]

結構容器

#include <iostream>
#include <stack>int main()
{std::stack<int> myStack;std::cout << myStack.size() << std::endl;std::cout << myStack.empty() << std::endl;//入棧myStack.push(1);myStack.push(2);myStack.push(3);std::cout << myStack.size() << std::endl;std::cout << myStack.empty() << std::endl;//獲取棧頂元素std::cout << myStack.top() << std::endl;//出棧myStack.pop();std::cout << myStack.top() << std::endl;return 0;
}

結構設計

順序棧

#include <iostream>class Stack
{
public:int*    data;                   //棧的數組int     topIndex;               //棧頂索引int     capacity;               //棧的容量public:Stack();                        //默認構造函數Stack(int Size);                //有參構造函數Stack(const Stack& other);      //拷貝構造函數~Stack();                       //默認析構函數public:void Push(int value);           //入棧函數void Pop();                     //出棧函數int Top();                      //棧頂元素public:bool IsEmpty();                 //是否為空int Size();                     //元素個數};Stack::Stack() : data(nullptr), topIndex(-1), capacity(0)
{}Stack::Stack(int Size) : topIndex(-1), capacity(Size)
{this->data = new int[capacity] {};
}Stack::Stack(const Stack& other) : data(new int[other.capacity]), topIndex(other.topIndex), capacity(other.capacity)
{for (size_t i = 0; i < capacity; i++){this->data[i] = other.data[i];}
}Stack::~Stack()
{if (data != NULL){delete[] data;data = nullptr;}
}void Stack::Push(int value)
{if (Size() == capacity){//默認容量int size = capacity;//動態擴容capacity = (capacity == 0) ? 5 : capacity * 2;//申請內存int* newData = new int[capacity] {};//數據拷貝memcpy(newData, this->data, size * sizeof(int));//釋放數據if (this->data != NULL){delete[] this->data;}//修正指向this->data = newData;}data[++topIndex] = value;
}void Stack::Pop()
{if (IsEmpty()){return;}--topIndex;
}int Stack::Top()
{return this->data[topIndex];
}bool Stack::IsEmpty()
{return this->topIndex == -1 ? true : false;
}int Stack::Size()
{return topIndex + 1;
}

鏈式棧

class Node
{
public:int value;Node* Next;Node(int Num) : value(Num), Next(nullptr) {}
};class Stack
{
public:Node* Head;public:Stack() : Head(nullptr) {}Stack(const Stack& other){if (other.Head == nullptr){Head = nullptr;}else{           Head = new Node(other.Head->value);Node* head = Head;Node* node = other.Head->Next;while (node != nullptr){head->Next = new Node(node->value);head = head->Next;node = node->Next;}}}~Stack(){Clear();}public:void Push(int value){Node* node = new Node(value);node->Next = Head;Head = node;}void Pop(){if (!IsEmpty()){Node* temp = Head;Head = Head->Next;delete temp;}}int Top(){if (!IsEmpty()){return Head->value;}}public:bool IsEmpty(){return Head == nullptr;}void Clear(){while (!IsEmpty()){Pop();}}};

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

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

相關文章

數據結構預科

在堆區申請兩個長度為32的空間&#xff0c;實現兩個字符串的比較【非庫函數實現】 要求&#xff1a; 1> 定義函數&#xff0c;在對區申請空間&#xff0c;兩個申請&#xff0c;主函數需要調用2次 2> 定義函數&#xff0c;實現字符串的輸入&#xff0c;void input(char …

31 C++11

本節目標 c11簡介列表初始化變量類型推導范圍for循環新增加容器右值新的類功能可變參數模板 1. c11簡介 在2003年標準委員會提交了一份計數勘誤表&#xff08;簡稱TC1&#xff09;&#xff0c;使得c03這個名字已經取代了c98稱為c11之前的最新的c標準名稱。不過由于c03&#x…

JAVA學習筆記DAY12——MySQL基礎

文章目錄 數據庫概述為什么要使用數據庫相關概念關系型和非關系型RDBMS非RDBMS - NoSQL MySQL圖形化管理工具Navicat SQL前后端環境nginx 反向代理MD5加密 數據庫概述 為什么要使用數據庫 持久化&#xff1a;指把數據保存到可掉電存儲設備中&#xff0c;一般指將內存中的數據…

詳解歸一化、標準化、正則化以及batch normalization

文章目錄 what(是什么)where&#xff08;用在哪&#xff09;How&#xff08;如何用&&原理&#xff09;歸一化實現方式原理示例說明 標準化實現方式原理示例說明 正則化實現方式原理作用 Batch Normalizationpytorch中的batch normalization原理BN的作用 歸一化、標準化…

代理設計模式和裝飾器設計模式的區別

代理設計模式: 作用:為目標(原始對象)增加功能(額外功能,拓展功能) 三種經典應用場景: 1&#xff1a;給原始對象增加額外功能(spring添加事務,Mybatis通過代理實現緩存功能等等) 2&#xff1a;遠程代理&#xff08;網絡通信&#xff0c;輸出傳輸&#xff08;RPC&#xff0c;D…

【TB作品】智能臺燈,ATMEGA16單片機,Proteus仿真

智能臺燈 1 adc檢測光強光敏電阻 顯示電壓 2 光強太高 也就是高于臨界值 就關閉小燈 3 光強太低 也就是低于臨界值 就打開小燈 3 按鍵修改臨界值 顯示 實驗報告&#xff1a;基于ATMEGA16單片機的智能臺燈設計與Proteus仿真 1. 實驗背景 智能臺燈是一種能夠根據環境光強自動調…

代碼隨想錄第40天|動態規劃

完全背包 完全背包物品可以無限使用 01背包核心代碼 01背包中的二維dp數組的兩個for遍歷可顛倒, 而一維dp數組的一定先遍歷物品再遍歷背包容量狀態轉移方程(背包容量一定為遞減) 完全背包核心代碼 (只在完全背包中一維dp數組嵌套順序可顛倒, 實際題目需要確定遍歷順序) 狀…

【高考志愿】建筑學

目錄 一、專業介紹 1.1 專業定義 1.2 專業培養目標 1.3 核心課程 二、就業方向和前景 2.1 就業方向 2.2 專業前景 三、報考注意 四、行業趨勢與未來展望 五、建筑學專業排名 一、專業介紹 1.1 專業定義 建筑學&#xff0c;這一充滿藝術與科技魅力的學科&#xff0c;…

天線 有源 無源 參數

無源測試駐波比VSWR/回波損耗(Return Loss)≤2效率≥50%輸入阻抗50R10%增益天線方向圖3D場強圖方向性 有源測試 OTA 傳導測試&#xff1a;發射功率傳導測試&#xff1a;接收靈敏度總輻射功率TRP(Total Radiated Power)≥發射功率減3dB總接收靈敏度TIS&#xff08;Total Isotrop…

JDBC1(JDBC相關類與接口 ?連接mysql數據庫? 測試 不同數據庫廠商實現-MySQL和Oracle)

目錄 一、JDBC 1. JDBC相關類與接口 1.1 DriverManager 1.2 Connection 1.3 Statement 4.ResultSet 2. JDBC工作原理 二、連接mysql數據庫 1. 導入jar包 2. 使用DriverManager加載驅動類 3. Connection接口 4. Statement接口 5. ResultSet接口 ?編輯 6. 關閉并…

顯卡簡介

顯卡是計算機系統中一個重要的組成部分&#xff0c;它負責處理圖形和視頻輸出。顯卡的性能直接影響到計算機的圖形處理能力&#xff0c;因此在游戲、視頻編輯、3D渲染等需要高性能圖形處理的應用中&#xff0c;顯卡的選擇至關重要。本文將從顯卡的基本概念、性能指標、市場現狀…

【Node.JS】入門

文章目錄 Node.js的入門涉及對其基本概念、特點、安裝、以及基本使用方法的了解。以下是對Node.js入門的詳細介紹&#xff1a; 一、Node.js基本概念和特點 定義&#xff1a;Node.js是一個基于Chrome V8引擎的JavaScript運行環境&#xff0c;它使得JavaScript能夠運行在服務器…

【鴻蒙學習筆記】基礎組件Progress:進度條組件

官方文檔&#xff1a;Progress 目錄標題 作用最全屬性迭代追加進度賦值風格樣式 作用 進度條組件 最全屬性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 顏色.width(200)// 大小.height(50)// 高度.value(50)// 進度可更…

視頻轉音頻:怎樣提取視頻中的音頻?6個提取音頻的小技巧(建議收藏)

怎樣提取視頻中的音頻&#xff1f;當我們想從視頻中提取出聲音時&#xff0c;通常會遇到很多問題。無論是想單獨提取出視頻里的音頻&#xff0c;還是把它轉成方便儲存或者分享的音頻格式&#xff0c;這都會涉及到視頻轉音頻的一個需求。因此&#xff0c;在這篇指南里&#xff0…

Spring Cloud - 項目搭建

1、新建maven項目 新建maven項目&#xff0c;該項目為主項目 1、新建maven項目 2、設置項目類型 3、選擇項目原型 4、設置參數 5、等著完成 2、設置項目信息 1、右鍵&#xff0c;項目屬性 2、設置jdk版本 3、選擇jdk17 4、修改編譯版本 5、右鍵項目&#xff0c;選擇maven->u…

【吊打面試官系列-MyBatis面試題】模糊查詢 like 語句該怎么寫?

大家好&#xff0c;我是鋒哥。今天分享關于 【模糊查詢 like 語句該怎么寫?】面試題&#xff0c;希望對大家有幫助&#xff1b; 模糊查詢 like 語句該怎么寫? 第 1 種&#xff1a;在 Java 代碼中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

CDH安裝和配置流程

這份文件是一份關于CDH&#xff08;Clouderas Distribution Including Apache Hadoop&#xff09;安裝的詳細手冊&#xff0c;主要內容包括以下幾個部分&#xff1a; 1. **前言**&#xff1a; - CDH是基于Apache Hadoop的發行版&#xff0c;由Cloudera公司開發。 - 相比…

技術派全局異常處理

前言 全局的異常處理是Java后端不可或缺的一部分&#xff0c;可以提高代碼的健壯性和可維護性。 在我們的開發中&#xff0c;總是難免會碰到一些未經處理的異常&#xff0c;假如沒有做全局異常處理&#xff0c;那么我們返回給用戶的信息應該是不友好的&#xff0c;很抽象的&am…

【一篇文章帶你搞懂--拉鏈表!!!拉鏈表的原理是什么!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是書生?&#xff0c;今天主要和大家分享一下拉鏈表的原理以及使用,希望對大家有所幫助。 大家可以關注我下方的鏈接更多優質文章供學習參考。 &#x1f49e;&#x1f49e;代碼是你的畫筆&#xff0c;創新是你…

深入解析:WebKit的JavaScript引擎與V8引擎的比較研究

在現代Web開發中&#xff0c;JavaScript引擎是瀏覽器的核心組件之一&#xff0c;它們負責解析和執行JavaScript代碼。WebKit和V8是兩個非常著名的JavaScript引擎&#xff0c;分別被用于不同的瀏覽器和環境中。WebKit的JavaScript引擎最初是Nitro&#xff0c;后來被JavaScriptCo…