數據結構----線性表(棧及其棧的實現)C語言 學習筆記

棧:線性邏輯結構

棧的分類?

順序棧:順序存儲結構實現的棧

鏈式棧:鏈式存儲結構實現的棧

相關概念

線性表:可以在任意位置操作

棧:對線性表進行約束

只能在一端插入和刪除操作的線性表,中間不允許操作。

棧底:棧底是棧中最早插入的元素位置,位于棧的最底層。除非棧為空,否則棧底元素始終是第一個被插入但最后被移除的數據。

棧頂:棧頂是棧結構中最新插入的元素所在位置,也是唯一允許進行插入和刪除操作的位置。

空棧:棧中無元素

棧的性質

性質:先進后出或后進先出。

棧頂“指針”和棧底“指針”

棧底“指針”:標記棧底位置

棧頂“指針”:標記棧頂位置

這里的“指針”并非真的的指針,這里這是為了方便描述。

應用場景

1.函數調用的實現(遞歸)

2.業務需求,倒著的邏輯。比如:撤銷,網頁頁面,歷史記錄

3.物理上的堆棧:先進后出

4.c++ STL庫stack

溢出的概念(為什么要判空和判滿?)

1.上溢:棧滿之后,繼續入棧。

2.下溢:棧空之后,繼續出棧。

棧的實現

1.順序棧

棧底“指針”指向下標為0的位置。

棧頂“指針”指向位置,有兩個位置指向:

1)指向真正棧頂元素的位置

操作:

I.初始化? ?
II.入棧?
III.出棧?
IV.得到棧頂元素?

2)指向真正棧頂元素的下一位置

I.初始化 top=0;

//定義一個順序棧
typedef struct {int* data;  //指針模擬開數組int top;    //棧頂“指針”
}stack;
//初始化
stack initstack(){stack s;s.data= (int*)malloc(sizeof(int*) * maxsize);if (s.data == NULL) {printf("分配空間失敗。\n");}else {s.top = -1;    //指向真正的棧頂元素的位置//s.top=0;     指向真正棧頂元素的下一位置}return s;
}

II.入棧 s->data[s->top]=k; s->top++;

//入棧
void PushStack(stack* s,int k) {//判滿if (s->top == maxsize - 1) {printf("棧滿。\n");}else {//指向真正的棧頂元素的位置/*s->top++;s->data[s->top] = k;*///指向真正棧頂元素的下一位置s->data[s->top] = k;s->top++;}
}

III.出棧 s->top--;

//出棧
void PopStack(stack* s) {//判空if (s->top == -1) {printf("空棧,無法出棧。\n");}else {s->top--;int x = s->data[s->top];printf("刪除了棧頂元素%d \n", x);}
}

IV.得到棧頂元素 top--;s->data[s->top];

//得到棧頂元素
int GetStack(stack* s) {/*指向真正的棧頂元素的位置return s->data[s->top];*///指向真正棧頂元素的下一位置s->top--;return s->data[s->top];
}

2.鏈棧------基于單鏈表實現的

I.初始化:初始化一個帶頭結點的的單鏈表

//定義一個鏈棧
struct stack{int data;struct stack* next;
};
typedef stack* LinkStack;
//初始化
LinkStack initStack() {LinkStack s = (stack*)malloc(sizeof(stack));if (s == NULL) {printf("空間分配失敗。\n");}else {s->next = NULL;}return s;
}

II.入棧:頭插法

//入棧
LinkStack PushStack(LinkStack s,int k) {stack* p = (stack*)malloc(sizeof(stack));if (p == NULL) {printf("入棧時,空間分配失敗。\n");}else {//頭插p->data = k;p->next = s->next;s->next = p;}return s;
}

III.出棧:刪除首元結點

//出棧
LinkStack PopStack(LinkStack s) {if (s->next == NULL) {printf("空棧,無法出棧。\n");}else {s->next= s->next->next;}return s;
}

IV.得到棧頂元素:首元結點的元素

//得到棧頂元素
LinkStack GetStack(LinkStack s) {if (s->next == NULL) {printf("空棧,無棧頂元素。\n");}else {int a=s->next->data;printf("棧頂元素是%d \n", a);}return s;
}

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

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

相關文章

手滑誤操作? vue + Element UI 封裝二次確認框 | 附源碼

一諾最近在做后臺管理系統時,遇到一個很常見但又容易被忽視的小問題:單選框切換時,用戶一不小心點錯,原有配置就沒了,數據丟失,后悔也來不及。你是不是也遇到過類似的場景?比如切換網絡模式、切…

力扣刷題367——有效的完全平方數

力扣刷題367——有效的完全平方數(69的相似題) 題目: 給你一個正整數 num 。如果 num 是一個完全平方數,則返回 true ,否則返回 false 。 完全平方數 是一個可以寫成某個整數的平方的整數。換句話說,它可以…

kubernetes架構原理與集群環境部署

kubernetes架構原理與集群環境部署概述為什么需要 KubernetesKubernetes 帶來的挑戰kubernetes架構解析master 節點的組件(1)API server(2)scheduler(3)Controller Manager(4)etcdNode 節點包含的組件(1)容器運行時(2)kubelet(3)kube-proxy代理kubernetes 網絡插件(1)Flannel 網…

Python爬蟲實戰:Requests與Selenium詳解

目錄 一 網絡爬蟲的了解 1 爬蟲庫 urllib庫 requests庫 scrapy庫 selenium庫 2 注意!!! 二 requests庫 1 request庫的安裝 2 認識網頁資源 3 獲取網頁資源 4 小案例 5 代理服務器 三 selenium 1 準備工作 2 應用 3 實例 一 網…

什么是樂觀鎖?什么是悲觀鎖?

🔒 深入淺出:樂觀鎖 vs 悲觀鎖終極對決!面試必考知識點詳解 各位CSDN的小伙伴們好呀!👋 我是雪碧聊技術,今天給大家帶來高并發編程中的核心概念——樂觀鎖與悲觀鎖的深度解析!💻 無論…

HTML前端性能優化完整指南

圖片優化:性能優化的重中之重 重新審視圖片的必要性 在開始優化之前,首先需要思考一個根本問題:要實現預期的視覺效果,真的需要使用圖片嗎? 隨著Web技術的快速發展,許多以往只能通過圖片實現的效果&…

數據煉金術:用Python做智能數據整理員

數據煉金術:用Python做智能數據整理員 解鎖自動化魔法:文件批量重命名Excel智能清洗數據凈化全流程實戰 一、數據整理的困境與破局之道 你是否面臨這些數據噩夢場景? 🧩 ??混亂文件目錄??:最終版_報告_V4(1).doc…

HTML基礎P1 | HTML基本元素

HTML標簽標簽名放在<>中&#xff0c;如<body>大部分標簽成對出現&#xff0c;如<h1>為開始標簽&#xff0c;</h1>為其對應的結束標簽&#xff0c;少數標簽只有開始標簽&#xff0c;如換行標簽<br/>&#xff0c;成為"單標簽"有的標簽中…

LVS集群搭建

集群是為了解決某個特定問題將多臺計算機組合起來形成的單個系統知識點&#xff1a;1.關鍵術語&#xff1a;VS&#xff1a;Virtual Server&#xff08;調度器&#xff09;RS&#xff1a;Real Server&#xff08;真實服務器&#xff09;CIP&#xff1a;Client IP&#xff08;客戶…

吳恩達《AI for everyone》第一周課程筆記

課程的核心目標&#xff1a;- AI是什么&#xff1f; - AI能做什么&#xff1f; - AI最擅長什么類型的任務&#xff1f; - AI怎么做決策&#xff1f; - 企業為什么需要AI戰略&#xff1f;導航Machine Learning 機器學習> 最常見的機器學習類型&#xff1a; > 人工智能中最…

iOS App 電池消耗管理與優化 提升用戶體驗的完整指南

在當今智能手機的使用中&#xff0c;電池壽命和續航能力是用戶選擇App時的重要考慮因素之一。iOS設備的電池管理功能較為封閉&#xff0c;這也讓開發者、產品經理以及普通用戶對于App的電池消耗有時無法全面了解。而如果你的App因電池消耗過快而遭到用戶卸載&#xff0c;無論功…

關于用git上傳遠程庫的一些常見命令使用和常見問題:

克隆遠程庫gitee到本地用命令git clone git clone https://gitee.com/automated-piggy-senior/20250717-test.gitLinux/macOS 終端&#xff1a; 執行 touch readme.txt&#xff08;創建空文件&#xff09;&#xff0c;或 echo "這是說明文件" > readme.txt&#…

想刪除表中重復數據,只留下一條,sql怎么寫

PostgreSQL 方法: DELETE FROM tbl_case_model WHERE id NOT IN (SELECT MIN(id) -- 保留id最小的記錄FROM tbl_case_modelGROUP BYcolumn1, -- 替換為實際重復列名column2, -- 繼續添加重復列... -- [所有需要比較的列] );因為我這次遇到的情況比較特殊&#xff0…

微服務中token鑒權設計的4種方式

1. JWT鑒權 「概述」&#xff1a;JWT是一種用于雙方之間安全傳輸信息的簡潔的、URL安全的令牌標準。它基于JSON格式&#xff0c;包含三個部分&#xff1a;頭部&#xff08;Header&#xff09;、負載&#xff08;Payload&#xff09;和簽名&#xff08;Signature&#xff09;。J…

nodejs搭建

1.創建一個空文件夾&#xff0c;在vscode中打開 2.執行命令開啟package文件 npm init -y3.設置根目錄文件app.js 先執行 npm install express 命令安裝 express 模塊 執行 npm install cors 命令安裝 cors 模塊 // app.js const express require(express) const app express…

frp內網穿透(二)

frp內網穿透&#xff08;二&#xff09; 前言 前篇內網穿透 上面一文中已描述如何安裝frp進行內網穿透&#xff0c;并配置ssh穿透連接內網服務器&#xff0c;本篇主要介紹如何配置web服務 使用場景 A服務器為公網服務器&#xff0c;B服務器為家庭中內網服務器&#xff0c;且B…

Spring 應用中 Swagger 2.0 遷移 OpenAPI 3.0 詳解:配置、注解與實踐

從 Swagger 2.0 到 OpenAPI 3.0 的升級指南 為什么升級 OpenAPI 3.0提供了更強大的功能、更簡潔的配置和更好的性能&#xff0c;同時保持了與 Swagger 2.0 的基本兼容性。本文將詳細介紹升級的各個步驟&#xff0c;并提供代碼示例。 1. 依賴管理的變化 Swagger 2.0 依賴配置 &l…

用 Flink CEP 打造實時超時預警:從理論到實戰

目錄 1. Flink CEP 是什么?為什么它能讓你的數據“開口說話”? 2. 超時預警的業務場景:從電商到物聯網 3. Flink CEP 超時機制的核心原理 3.1 模式匹配與時間窗口 3.2 超時事件的處理 3.3 事件時間與水位線 3.4 核心組件一覽 4. 實戰案例:電商訂單超時預警 4.1 準備…

Rocky Linux 9 源碼包安裝php7

Rocky Linux 9 源碼包安裝php7大家好&#xff01;我是星哥。盡管現在 PHP 版本已迭代至 8.x&#xff0c;但有時為了兼容遺留系統或特定應用需求&#xff0c;我們仍需部署特定版本的 PHP。最主要的是之前的項目采用的PHP7.3&#xff0c;未來兼容舊的項目&#xff0c; 今天&#…

uniapp+vue3+鴻蒙系統的開發

前言&#xff1a; uniappvue3鴻蒙系統的開發。 實現效果&#xff1a; 鴻蒙pad端真機測試效果-下面是正常的日志效果 實現步驟&#xff1a; 1、安裝鴻蒙的開發工具&#xff0c;點擊安裝&#xff0c;注意版本不能太舊了 deveco-studio 2、下載下來是個壓縮包&#xff0c;解壓后…