【數據結構】棧的順序存儲(整型棧、字符棧)

【數據結構】棧的順序存儲(整型棧、字符棧)

      • 一、棧的結構定義
      • 二、字符棧的初始化、入棧、出棧、判斷是否棧為空、獲取棧頂元素、獲取棧的當前元素個數等操作
      • 三、整型棧的初始化、入棧、出棧、判斷是否棧為空、獲取棧頂元素、獲取棧的當前元素個數等操作

一、棧的結構定義

MaxSize: 順序棧的長度
s.top: 指針,指向棧頂元素。當棧為空時,指向-1。
s.data[MaxSize]: 順序棧,用數組表示

#define MaxSize 50
typedef struct SqStack{char data[MaxSize]; // 數據 int top; // 指針 
}SqStack;
棧空s.top = -1
棧滿s.top = MaxSize - 1
棧頂元素s.data[s.top]
棧的當前元素個數s.top + 1(因為元素從索引0開始,所以元素個數是:索引值+1)

二、字符棧的初始化、入棧、出棧、判斷是否棧為空、獲取棧頂元素、獲取棧的當前元素個數等操作

#include <stdio.h>
using namespace std;#define MaxSize 50
typedef struct SqStack{char data[MaxSize]; // 數據 int top; // 指針 
}SqStack;//InitStack(&s):初始化一個空棧 S。
void InitStack(SqStack &s){s.top = -1;
}//StackEmpty(s):判斷一個棧是否為空,若棧s為空則返回 true,否則返回 false。
bool StackEmpty(SqStack s){if(s.top == -1) return true;return false;
}//Push(&s,x): 入棧,若棧s未滿,則將x加入使之成為新棧頂。
bool Push(SqStack &s, char x){if(s.top == MaxSize - 1) return false;s.data[++s.top] = x;return true;
}//Pop(&S,&x):出棧,若棧s非空,則彈出棧頂元素,并用x返回。
bool Pop(SqStack &s, char &x){if(s.top == -1) return false;x = s.data[s.top--];return true;
}//GetTop(s,&x):讀棧頂元素,但不出棧,若棧s非空,則用x返回頂元素。
bool GetTop(SqStack s, char &x){if(s.top == -1) return false;x = s.data[s.top];return true;	
}//Destroystack(&s):銷毀棧,并釋放棧s占用的存儲空間(“&”表示引用調用)。//getNum(s): 獲取棧的當前元素個數
int GetNum(SqStack s){if(s.top == -1) return 0;return s.top + 1;
} 
int main() {SqStack s;InitStack(s); bool flag = true;int choose;while(flag){printf("\n=======================\n");printf("1.入棧\n");printf("2.出棧\n");printf("3.判斷是否棧為空\n");printf("4.讀棧頂元素\n");printf("5.獲取棧的當前元素個數\n");printf("6.退出\n");printf("=======================\n");printf("請選擇:");scanf("%d", &choose);switch(choose) {case 1:char x;printf("輸入要新入棧的字符:");scanf(" %c", &x); // 注意,此時%c前面需要加個空格,使得scanf跳過任何空白字符(包括換行符),然后讀取下一個非空白字符。 if(Push(s, x)) printf("成功把%c入棧!\n", x);else printf("入棧失敗!\n");break;case 2:char x2;if(Pop(s, x2)) printf("%c出棧成功!\n", x2);else printf("出棧失敗!\n");break;case 3:if(StackEmpty(s)) printf("棧為空!\n");else printf("棧暫時不為空!\n");break;case 4:char x3;if(GetTop(s, x3)) printf("當前棧的棧頂元素是:%c\n", x3);else printf("出錯!\n");break;case 5:printf("棧的當前元素個數是:%d", GetNum(s));break;case 6:flag = false;break; default:printf("非法輸入!\n");break;	 } }
}

三、整型棧的初始化、入棧、出棧、判斷是否棧為空、獲取棧頂元素、獲取棧的當前元素個數等操作

很簡單,只是把data數組及參數x的數據類型從char改為int類型就好了。

#include <bits/stdc++.h>
using namespace std;/*
棧空: top = -1
棧滿: top = MaxSize - 1
棧頂元素: SqStack[top] 
*/
#define MaxSize 50
typedef struct SqStack{int data[MaxSize]; // 數據 int top; // 指針 
}SqStack;//InitStack(&s):初始化一個空棧 S。
void InitStack(SqStack &s){s.top = -1;
}//StackEmpty(s):判斷一個棧是否為空,若棧s為空則返回 true,否則返回 false。
bool StackEmpty(SqStack s){if(s.top == -1) return true;return false;
}//Push(&s,x): 入棧,若棧s未滿,則將x加入使之成為新棧頂。
bool Push(SqStack &s, int x){if(s.top == MaxSize - 1) return false;s.data[++s.top] = x;return true;
}//Pop(&S,&x):出棧,若棧s非空,則彈出棧頂元素,并用x返回。
bool Pop(SqStack &s, int &x){if(s.top == -1) return false;x = s.data[s.top--];return true;
}//GetTop(s,&x):讀棧頂元素,但不出棧,若棧s非空,則用x返回頂元素。
bool GetTop(SqStack s, int &x){if(s.top == -1) return false;x = s.data[s.top];return true;	
}//Destroystack(&s):銷毀棧,并釋放棧s占用的存儲空間(“&”表示引用調用)。//getNum(s): 獲取棧的當前元素個數
int GetNum(SqStack s){if(s.top == -1) return 0;return s.top + 1;
} 
int main() {SqStack s;InitStack(s); bool flag = true;int choose;while(flag){printf("\n=======================\n");printf("1.入棧\n");printf("2.出棧\n");printf("3.判斷是否棧為空\n");printf("4.讀棧頂元素\n");printf("5.獲取棧的當前元素個數\n");printf("6.退出\n");printf("=======================\n");printf("請選擇:");scanf("%d", &choose);switch(choose) {case 1:int x;printf("輸入要新入棧的字符:");scanf("%d", &x);if(Push(s, x)) printf("成功把%d入棧!\n", x);else printf("入棧失敗!\n");break;case 2:int x2;if(Pop(s, x2)) printf("%d出棧成功!\n", x2);else printf("出棧失敗!\n");break;case 3:if(StackEmpty(s)) printf("棧為空!\n");else printf("棧暫時不為空!\n");break;case 4:int x3;if(GetTop(s, x3)) printf("當前棧的棧頂元素是:%d\n", x3);else printf("出錯!\n");break;case 5:printf("棧的當前元素個數是:%d", GetNum(s));break;case 6:flag = false;break; default:printf("非法輸入!\n");break;	 } }
}

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

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

相關文章

【大模型實戰】向量數據庫實戰 - Chroma Milvus

在 RAG&#xff08;檢索增強生成&#xff09;場景中&#xff0c;非結構化數據&#xff08;文本、圖像等&#xff09;的高效檢索是核心需求。傳統關系型數據庫難以勝任&#xff0c;而向量數據庫通過將數據轉化為向量、基于相似度快速匹配&#xff0c;成為 RAG 的關鍵支撐。本文聚…

pytorch程序語句固定開銷分析

深入探索PyTorch與Python的性能微觀世界&#xff1a;量化基礎操作的固定開銷 在深度學習的性能優化工作中&#xff0c;開發者通常將目光聚焦于模型結構、算法效率和并行計算策略。然而&#xff0c;在這些宏觀優化的背后&#xff0c;構成我們代碼的每一條基礎語句——無論是PyTo…

ABP VNext + CloudEvents:事件驅動微服務互操作性

ABP VNext CloudEvents&#xff1a;事件驅動微服務互操作性 &#x1f680; &#x1f4da; 目錄ABP VNext CloudEvents&#xff1a;事件驅動微服務互操作性 &#x1f680;一、引言 ??? TL;DR&#x1f4da; 背景與動機&#x1f3d7;? 整體架構圖二、環境準備與依賴安裝 &am…

軟件測試測評公司關于HTTP安全頭配置與測試?

瀏覽器和服務器之間那幾行看不見的HTTP安全頭配置&#xff0c;往往是抵御網絡攻擊的關鍵防線。作為軟件測試測評公司&#xff0c;我們發現超過六成的高危漏洞源于安全頭缺失或誤配。別小看這些響應頭&#xff0c;它們能直接掐斷跨站腳本、點擊劫持、數據嗅探的攻擊路徑。五條命…

Mysql集成技術

目錄 mysql的編譯安裝與部署 1.編譯安裝mysql 2.部署mysql mysql主從復制 什么是mysql主從復制&#xff1f; 1.配置master 2.配置slave 3.存在數據時添加slave2 4.GTID模式 什么是GTID模式&#xff1f; 配置GTID 5.延遲復制 6.慢查詢日志 核心作用 開啟慢查詢日志…

《MySQL進階核心技術剖析(一): 存儲引擎》

目錄 一、存儲引擎 1.1 MySQL體系結構 1.2 存儲引擎介紹 1). 建表時指定存儲引擎 2). 查詢當前數據庫支持的存儲引擎 1.3 存儲引擎特點 1.3.1 InnoDB 1.3.2 MyISAM 1.3.3 Memory 1.3.4 區別及特點 1.4 存儲引擎選擇 一、存儲引擎 1.1 MySQL體系結構 1). 連接層 最上…

sqli-labs:Less-26關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;單引號包裹&#xff09;、GET操作提示&#xff1a;參數需以閉合關鍵參數&#xff1a;id php輸出語句的部分代碼&am…

Spring Boot 的事務注解 @Transactional 失效的幾種情況

開發中我們經常會用到 Spring Boot 的事務注解&#xff0c;為含有多種操作的方法添加事務&#xff0c;做到如果某一個環節出錯&#xff0c;全部回滾的效果。但是在開發中可能會因為不了解事務機制&#xff0c;而導致我們的方法使用了 Transactional 注解但是沒有生效的情況&…

#C語言——刷題攻略:牛客編程入門訓練(四):運算

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題合集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"代碼行數決定你的下限&#xff0c;算法思維決定你的上限。" 目錄 1. BC25 牛牛買電…

阻抗分析中的軟件解調計算

接上篇 重溫無功功率測量-CSDN博客 已知被測阻抗兩端電壓與流過 通過兩個ADC同步采集到。 激勵頻率10k, 采樣率1M, 每周期100個點 關鍵是:采樣率除以激勵頻率, 得是4的倍數... 所以ADC不能自由運行, 得用一個timer來觸發. 因為要進行同相分量正交分量計算。 1&#xff1a;直…

ubuntu 鏡像克隆

一、克隆 1、準備 一個u盤&#xff08;制作啟動盤&#xff09; 一個移動固態硬盤&#xff08;大于要克隆系統盤的1.2倍&#xff09; 2、使用 rufus生成系統啟動盤 &#xff08;1&#xff09;下載ubuntu iso 桌面版 https://cn.ubuntu.com/download &#xff08;2&#x…

Axure下拉菜單:從基礎交互到高保真元件庫應用

在Web端產品設計中&#xff0c;下拉菜單&#xff08;Dropdown Menu&#xff09; 是用戶與系統交互的核心組件之一&#xff0c;它通過隱藏次要選項、節省頁面空間的方式&#xff0c;提升信息密度與操作效率。無論是基礎下拉菜單、圖標式下拉菜單&#xff0c;還是復雜的多級下拉菜…

復現YOLOV5+訓練指定數據集

一、復現YOLOV5代碼 1.github下載&#xff1a;https://github.com/MIPIT-Team/SSA-YOLO 2.配置環境&#xff1a;創建虛擬環境yolo5 conda create -n yolo5 python3.9 #對應文件夾下pip install -r requirements.txt報錯&#xff1a;ERROR: pips dependency resolver does no…

Agents-SDK智能體開發[4]之集成MCP入門

文章目錄說明一 Agents SDK接入MCP1.1 MCP技術回顧1.2 MCP基礎實踐流程1.2.1 天氣查詢服務器Server創建流程1.2.2 服務器依賴安裝和代碼編寫1.2.3 環境配置文件1.2.4 客戶端代碼編寫1.3 測試運行二 MCPAgents SDK基礎調用2.1 weather_server.py2.2 client_agent.py2.3 運行測試…

Camera相機人臉識別系列專題分析之十九:MTK ISP6S平臺FDNode傳遞三方FFD到APP流程解析

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: Camera相機人臉識別系列專題分析之十九:MTK平臺FDNode傳遞三方FFD到APP流程解析 目錄 一、背景 二、:OcamMeta傳遞FFD到APP 2.1:OcamMeta 2.2 :OcamMeta::process更新FFD 2.…

【實時Linux實戰系列】構建實時監測與報警系統

在實時系統中&#xff0c;監測與報警系統是確保系統正常運行和及時響應異常情況的關鍵組件。實時監測與報警系統能夠實時收集系統數據&#xff0c;分析關鍵事件&#xff0c;并在檢測到異常時發出警報。這種系統廣泛應用于工業自動化、醫療設備監控、網絡安全等領域。掌握實時監…

PHP入門及數據類型

PHP數據類型 PHP標記 //HTML風格 <?phpecho "hello world"; ?> //簡短風格 <?echo "hello world"; ?>數據類型 PHP 最初源于 Perl 語言&#xff0c;與 Perl 類似&#xff0c;PHP 對數據類型采取較為寬松的態度。PHP 規定&#xff0c;變量數…

沸點 | 嬴圖參加世界人工智能大會

2025 WAIC于 7 月 26 日至 28 日在上海舉行。大會展覽面積突破 7 萬平方米&#xff0c;800 余家企業參展。嬴圖作為圖數據庫領域的領先企業&#xff0c;攜前沿技術與創新應用精彩亮相。?大會期間&#xff0c;嬴圖創始人兼CEO孫宇熙與來自全球的頂尖學者、企業代表共同探討人工…

2. 字符設備驅動

一、設備號 1.1. 什么是設備號 設備號是用來標記一類設備以及區分這類設備中具體個體的一組號碼。 設備號由主設備號和次設備號組成。主設備號的作用為標記一類設備、用于標識設備驅動程序,而次設備號的作用是為了區分這類設備中的具體個體設備及用于標識同一驅動程序下的具…

uboot armv8 啟動流程之 linker script

section 詳細說明.text按如下順序&#xff0c;中斷向量表vectors, 啟動入口代碼start.o,普通text, glue &#xff08;arm thumb2 相互調用時自動生成的代碼&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 標記為text 段入口&#xff0c;…