棧的實現(C語言)

文章目錄

  • 前言
  • 1.棧的概念及結構
  • 2.棧的實現
  • 3.具體操作
    • 3.1.初始化棧(StackInit)和銷毀棧(StackDestory)
    • 3.2.入棧(StackPush)和出棧(StackPop)
    • 3.3.獲得棧的個數(StackSize)、獲得棧頂元素(StackTop)以及判空(StackEmpty)


前言

前段時間我們學習過了鏈表和順序表等相關操作,今天學習一個比較特殊的數據結構—棧(Stack)


1.棧的概念及結構

棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據也在棧頂

在這里插入圖片描述

2.棧的實現

棧的實現一般可以使用數組或者鏈表實現,相對而言數組的結構實現更優一些。因為數組在尾上插入數據的代價比較小。
既然是使用數組進行維護,那么棧的結構:

typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//用于確定數組個數,又可以通過top下標獲得棧頂的元素int capacity;
}Stack;

還有一些操作

#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//用于確定數組個數,又可以通過top下標獲得棧頂的元素int capacity;
}Stack;
//初始化
void StackInit(Stack* ps);
//銷毀棧
void StackDestory(Stack* ps);
//入棧
void StackPush(Stack* ps, STDataType x);
//出棧
void StackPop(Stack* ps);
//獲得棧頂元素
STDataType StackTop(Stack* ps);
//獲得棧的個數
int StackSize(Stack* ps);
//判斷棧是否為空
bool StackEmpty(Stack* ps);

下面對這些方法進行演示


3.具體操作

3.1.初始化棧(StackInit)和銷毀棧(StackDestory)

//初始化
void StackInit(Stack* ps) {assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}
//銷毀棧
void StackDestory(Stack* ps) {assert(ps);free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}

3.2.入棧(StackPush)和出棧(StackPop)

//入棧
void StackPush(Stack* ps, STDataType x) {assert(ps);if (ps->capacity == ps->top) {int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity*sizeof(Stack));if (tmp == NULL) {perror("realloc fail");return;}ps->arr = tmp;ps->capacity = newCapacity;}ps->arr[ps->top] = x;ps->top++;
}
//出棧
void StackPop(Stack* ps) {assert(ps);assert(ps->size>0);ps->top--;
}

3.3.獲得棧的個數(StackSize)、獲得棧頂元素(StackTop)以及判空(StackEmpty)

//獲得棧頂元素
STDataType StackTop(Stack* ps) {assert(ps);assert(ps->arr);return ps->arr[ps->top-1];
}
//獲得棧的個數
int StackSize(Stack* ps) {assert(ps);return ps->top;
}
//判斷棧是否為空
bool StackEmpty(Stack* ps) {assert(ps);return ps->top == 0;
}

只能說跟順序表的流程一模一樣,只不過就是棧只能在棧頂放或者拿數據就行,完。

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

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

相關文章

go-zero 實戰(4)

中間件 在 userapi 項目中引入中間件。go項目中的中間可以處理請求之前和之后的邏輯。 1. 在 userapi/internal目錄先創建 middlewares目錄&#xff0c;并創建 user.go文件 package middlewaresimport ("github.com/zeromicro/go-zero/core/logx""net/http&q…

經濟寒冬下的黃金跳板:方案、活動、競標一手掌握

推薦策劃人必備的寶藏地產策劃資源平臺&#xff0c; 訂閱浩叫&#xff1a;地產營銷策劃圈。這個平臺簡直是地產策劃人的百寶箱&#xff0c;里面藏著無數的策劃秘籍&#xff0c;等著你來挖掘。 這個平臺就像是一個大型的方案庫&#xff0c;里面收錄了眾多知名地產企業的內部資料…

leetcode:計數質數

class Solution { public:// 如果 x 是質數&#xff0c;那么大于 x 的 x 的倍數 2x,3x… 一定不是質數int countPrimes(int n) {vector<int> isPrime(n, 1);int ans 0;for (int i 2; i < n; i) {if (isPrime[i]) {ans 1;if ((long long)i * i < n) {for (int j …

leetcode-55 跳躍游戲

leetcode Problem: 55. 跳躍游戲 思路 假設我們是一個小人&#xff0c;從第一個下標開始&#xff0c;每次經過一個位置&#xff0c;我們就可以根據當前位置的數值nums[i]和位置下標i計算出該位置所能到達的后續位置的最大值rnums[i]i。而這個r之前的區域一定都是可以經過的。…

AI 談“潯川AI翻譯機”

在天工AI&#xff0c;天工AI在全網搜索“潯川AI翻譯機”。 1 創作助手談“潯川AI翻譯機”&#xff1a; “潯川AI翻譯機”是一個利用人工智能技術進行語言翻譯的設備或應用程序。它可以將一種語言的文字或口語翻譯成另一種語言&#xff0c;以實現不同語言之間的溝通和理解。潯…

08. Redis 緩存穿透和雪崩

文章目錄 1. 緩存穿透&#xff08;查不到導致的&#xff09;1.1 概念1.2 解決方案布隆過濾器緩存空對象 2. 緩存擊穿&#xff08;量太大、緩存過期&#xff09;2.1 概念2.2 解決方案設置熱點數據永不過期加互斥鎖 3. 緩存雪崩&#xff08;緩存集體失效或 Redis 宕機&#xff09…

說一下你對dom驅動和數據驅動的理解

DOM驅動和數據驅動是前端開發中兩種常見的操作方式&#xff0c;尤其在構建用戶界面時。下面&#xff0c;我將分別解釋這兩種驅動方式&#xff0c;并提供詳細的代碼示例。 DOM驅動 DOM驅動的核心思想是直接操作DOM元素來更新用戶界面。在早期的Web開發中&#xff0c;這種方式非…

Linux指令初識

ls:顯示當前目錄底下的指定文件或目錄 ls -l更詳細的信息 ls -a顯示當前目錄下的所有文件 命令中的選項可以一次傳遞多個 ,例如&#xff1a;ls -al 命令和選項有必須一個或多個空格 以.開頭的文件&#xff0c;為隱藏文件ls -a可以看到,ls -l看不見 支持命令拼在一起&#…

牛客熱題:滑動窗口的最大值

&#x1f4df;作者主頁&#xff1a;慢熱的陜西人 &#x1f334;專欄鏈接&#xff1a;力扣刷題日記 &#x1f4e3;歡迎各位大佬&#x1f44d;點贊&#x1f525;關注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目錄 牛客熱題&#xff1a;滑動窗口的最大值題目鏈接方法一…

DNS服務的部署與配置(2)

1、dns的安裝及開啟 dnf install bind.x86_64 -y #安裝 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #啟用dns服務&#xff0c;服務名稱叫named firewall-cmd --permanent --add-servicedns #火墻設置 firewall-cmd --reload …

【手把手搓組件庫】從零開始實現Element Plus--組件開發

從零開始實現Element Plus--組件開發 nvmnvm的作用&#xff1a;nvm的使用方法 需求分析提示詞Kimi 生成產品需求文檔kimi 生成測試用例 初始化 vitest完善 Button 組件1、定義 types.ts2、Button.vue 引入 types.ts3、添加Button樣式點擊事件 添加節流添加 Icon 集成 StoryBook…

C++第十九彈---string模擬實現(下)

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、修改操作 2、迭代器操作 3、字符串操作 4、非成員函數重載操作 總結 1、修改操作 1、string& operator (const char* s); //尾部插入…

【Text2SQL 論文】SeaD:使用 Schema-aware 去噪訓練的 end2end 的 Text2SQL

論文&#xff1a;SeaD: End-to-end Text-to-SQL Generation with Schema-aware Denoising ?? NAACL 2022, arXiv:2105.07911 本論文提出 SeaD 模型&#xff0c;使用 schema-aware 的去噪方法來訓練一個 end2end、seq2seq 的 Transformer 模型來實現 Text2SQL。 一、論文速讀…

C++系列-static成員

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” 概念 聲明為static的類成員稱為類的靜態成員&#xff0c;用static修飾的成員變量&#xff0c;稱之為靜態成員變量&#xff0c;用static修飾的成員函數&#xff0c;稱之為靜態成…

stm32學習-流水燈

接線 注意&#xff1a;LED燈長一點的引腳是正極。 配置GPIO 1.使用RCC開啟GPIO時鐘 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1Perip…

Stanford斯坦福 CS 224R: 深度強化學習 (2)

實用深度強化學習實現技術 強化學習(RL)是一種通過智能體與環境交互來學習最優決策的機器學習范式。而深度強化學習(DRL)則將深度學習技術引入RL領域,利用深度神經網絡強大的函數擬合能力來處理高維觀察空間,取得了顯著的成功。本章我們將重點介紹一種經典的DRL算法:Q-Learnin…

【Qt 學習筆記】Qt窗口 | 菜單欄 | QMenuBar的使用及說明

博客主頁&#xff1a;Duck Bro 博客主頁系列專欄&#xff1a;Qt 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Qt窗口 | 菜單欄 | QMenuBar的使用及說明 文章編號&#xff1a;Qt 學習…

第20屆文博會:“特別呈現”—周瑛瑾雷米·艾融雙個展,著名美術評論家,批評家彭德教授對周瑛瑾作品進行評論

周瑛瑾不是學院派藝術家&#xff0c;但在彩墨畫領域的天賦超出中國八大美院的同類型畫家。相比具有批判意識的當代藝術&#xff0c;他的彩墨藝術如同我們這個苦難世界的創可貼和安慰劑。當我面對他的彩墨畫&#xff0c;首先是驚艷&#xff0c;隨之想到屈原的離騷&#xff0c;還…

無源相控陣雷達

什么是無源相控陣雷達 無源相控陣雷達&#xff08;Passive Electronically Scanned Array Radar&#xff0c;簡稱PESA雷達&#xff09;是一種雷達系統。這里的“無源”并未指其不發射信號&#xff0c;而是指其陣列單元不會產生并發射信號&#xff0c;其特點在于天線表面的陣列…

Vue與React、Angular的比較

Vue、React和Angular是前端開發中三個流行的JavaScript框架&#xff0c;它們各自具有不同的特點、優勢和適用場景。以下是對這三個框架的比較&#xff1a; 1. 基本概念 Vue&#xff1a;Vue是一套用于構建用戶界面的漸進式框架&#xff0c;其核心庫專注于視圖層&#xff0c;易…