手撕數據結構之棧+例題

目錄

一、棧的概念及結構

二、棧的頭文件及基本框架

三、接口實現

1、對棧的初始化

?2、棧的銷毀

3、入棧操作

4、出棧操作

?5、判斷棧是否為空

6、返回棧頂元素

7、遍歷棧

四、有效的括號 - 力扣(LeetCode)

題目描述:

?思路:

代碼:


一、棧的概念及結構

棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出的原則。

如同子彈夾,我們進行添子彈和出子彈,很形象。

壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。

出棧:棧的刪除操作叫做出棧。出數據也在棧頂。

?接下來,我們以數組棧的形式去模擬。

二、棧的頭文件及基本框架

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int STDataType;typedef struct Stack
{STDataType* a;//就是以a開頭的一段連續的空間int top;//定義棧頂位置int capacity;
}ST;void SLInit(ST* ps);
void SLDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);
STDataType STTop(ST* ps);//獲取棧頂元素

三、接口實現

1、對棧的初始化

void SLInit(ST* ps)
{ST* ret = (ST*)malloc(4 * sizeof(ST));if (ret == NULL){perror(malloc);exit(-1);}ps->a = ret;ps->capacity = 4;ps->top = 0;
}

?2、棧的銷毀

void SLDestroy(ST* ps)
{free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

3、入棧操作

void STPush(ST* ps, STDataType x)
{assert(ps != NULL);//檢查需不需要擴容if (ps->top == ps->capacity){ps->capacity += 4;ST* ret = (ST*)realloc( ps->a, sizeof(ST) * ps->capacity);if (ret == NULL){perror(realloc);exit(-1);}ps->a = ret;}ps->a[ps->top] = x;ps->top++;
}

4、出棧操作

void STPop(ST* ps)
{assert(ps);ps->top--;
}

?5、判斷棧是否為空

bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;如果右邊等式成立返回true,反之返回false
}

6、返回棧頂元素

STDataType STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}

7、遍歷棧

不同于其他數據結構,遍歷棧不用print

//遍歷棧的特殊方式while (!STEmpty(&ps)){printf("%d ", STTop(&ps));STPop(&ps);}

四、有效的括號 - 力扣(LeetCode)

題目描述:

給定一個只包括?'('')''{''}''['']'?的字符串?s?,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。
  3. 每個右括號都有一個對應的相同類型的左括號。

?思路:

如果是左括號就入棧,如果是右括號就與棧頂元素進行比較。這樣就正好匹配題目的要求,但博主目前沒有學過STL庫,所以只能將上面的手撕棧CV一下啦,下面的代碼為了避免冗余去除掉這一部分~

代碼:

bool isValid(char * s)
{char* ret = s;int num = 0;//利用奇數偶數判斷數量是否匹配while(*ret){num++;ret++;}if(num%2 != 0){return false;}ST ps;SLInit(&ps);while(*s){switch(*s){case '{':case '[':case '(':STPush(&ps,*s);break;case ')':case ']':case '}':if(STSize(&ps) == 0)return false;if(*s == ']' && STTop(&ps) != '['||*s == ')' && STTop(&ps) != '('||*s == '}' && STTop(&ps) != '{'){SLDestroy(&ps);return false;}STPop(&ps);break;}s++;}//防止((出現if(!STEmpty(&ps))return false;return true;
}

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

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

相關文章

靜態網頁和動態網頁區別

1&#xff0c;靜態網頁和動態網頁有何區別 1) 更新和維護 靜態網頁內容一經發布到網站服務器上&#xff0c;無論是否有用戶訪問&#xff0c;這些網頁內容都是保存在網站服務器上的。如果要修改網頁的內容&#xff0c;就必須修改其源文件&#xff0c;然后重新上傳到服務器上。…

k8s-----集群調度

目錄 一&#xff1a;調度約束 二&#xff1a;Pod 啟動創建過程 三&#xff1a;k8s調度過程 1、Predicate 有一系列的常見的算法 2、常見優先級選項 3、指定調度節點 &#xff08;1&#xff09;nodeName指定 &#xff08;2&#xff09;nodeSelector指定 四&#xff1a;親和…

【SA8295P 源碼分析】68 - Android 側用戶層 輸入子系統獲取 /dev/input/event0 節點數據 代碼流程分析

【SA8295P 源碼分析】68 - Android 側用戶層 輸入子系統獲取 /dev/input/event0 節點數據 代碼流程分析 一、EventHub.cpp 監聽 /dev/input/event0 節點流程二、EventHub.cpp 讀取 /dev/input/event0 節點數據流程系列文章匯總見:《【SA8295P 源碼分析】00 - 系列文章鏈接匯總…

C++——繼承

文章目錄 &#x1f99c;1. 什么是繼承&#x1f40a;1.1 概念&#x1f40a;1.2 格式&#x1f40a;1.3 繼承方式 & 訪問限定符 &#x1f426;2. 派生類和基類的賦值問題&#x1f9a9;3. 派生類和基類同名成員問題&#x1f413;4.派生類默認成員函數&#x1f409;4.1 構造函數…

React源碼解析18(1)------ React.createElement 和 jsx

1.React.createElement 我們知道在React17版本之前&#xff0c;我們在項目中是一定需要引入react的。 import React from “react” 即便我們有時候沒有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React項目中&#xff0c;如果我們使用了模板語法JSX&am…

使用OkHttp發送POST請求的幾種方式

使用OkHttp發送POST請求的幾種方式 介紹pom依賴基本的POST請求帶授權的POST請求POST方式發送JSON數據Multipart POST 請求 介紹 本文將介紹 OkHttp 客戶端的基本用法。 主要介紹 OkHttp 3.x 版本中發送Post請求的幾種方式。 pom依賴 <dependency><groupId>com.sq…

單調遞增的數字——力扣738

文章目錄 題目描述解法題目描述 解法 #include<iostream> #include<string>using namespace std;int monotoneIncreasingDigits

【學習】若依源碼(前后端分離版)之 “ 異常處理”

大型紀錄片&#xff1a;學習若依源碼&#xff08;前后端分離版&#xff09;之 “ 異常處理” 前言1、統一返回實體定義2、定義登錄異常定義3、基于ControllerAdvice注解的Controller層的全局異常統一處理4、測試訪問請求結語 前言 通常一個web框架中&#xff0c;有大量需要處理…

中小企業項目管理軟件推薦:選擇適合的工具提升項目效率!

中小企業項目管理軟件有哪些&#xff1f;Zoho Projects是一款好用無廣告的項目管理軟件。當個小創業者是真的不容易&#xff0c;不僅要管理團隊&#xff0c;還要管理團隊項目。很多團隊之前用了好多項目管理的軟件&#xff0c;但是都不太滿意。但是如果你經常參加創業者聚會上&…

常見的路由協議之RIP協議與OSPF協議

目錄 RIP OSPF 洪泛和廣播的區別 路由協議是用于在網絡中確定最佳路徑的一組規則。它們主要用于在路由器之間交換路由信息&#xff0c;以便找到從源到目標的最佳路徑。 常見的路由協議&#xff1a; RIP (Routing Information Protocol)&#xff1a;RIP 是一種基于距離向量算…

Mac os 上的apt-get install 就是brew install

Mac os 上面不支持apt-get install ,但是有個 brew install可以代替。 Homebrew是Mac OS的包管理器&#xff0c;可以方便地安裝各種需要的軟件。 1.1 安裝Homebrew 如果沒有安裝Homebrew&#xff0c;需要在終端輸入以下命令進行安裝&#xff1a; /usr/bin/ruby -e "$(…

使用wxPython和PyMuPDF在Python中顯示PDF目錄的實現

展示如何使用wxPython和PyMuPDF庫在Python中選擇PDF文件并將目錄顯示在列表框中。 簡介&#xff1a; 在本篇教程中&#xff0c;我們將學習如何使用wxPython和PyMuPDF庫在Python中選擇PDF文件&#xff0c;并將其目錄顯示在一個列表框中。這將使用戶能夠方便地瀏覽PDF文檔的目錄…

c#實現設配器模式

下面是一個使用C#實現適配器模式的示例代碼&#xff1a; using System;// 目標接口 public interface ITarget {void Request(); }// 目標類 public class Target : ITarget {public void Request(){Console.WriteLine("目標類的請求");} }// 需要適配的類 public c…

Golang 局部變量、全局變量 聲明

文章目錄 一、局部變量二、全局變量 一、局部變量 四種聲明方式 多變量聲明&#xff1a; package mainimport "fmt"//局部變量聲明 func main() {//方法一: 聲明一個變量和數據類型&#xff0c;不初始化值&#xff1b;默認值為0&#xff1b;var lvA intfmt.Printl…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的區別

個人主頁&#xff1a;金鱗踏雨 個人簡介&#xff1a;大家好&#xff0c;我是金鱗&#xff0c;一個初出茅廬的Java小白 目前狀況&#xff1a;22屆普通本科畢業生&#xff0c;幾經波折了&#xff0c;現在任職于一家國內大型知名日化公司&#xff0c;從事Java開發工作 我的博客&am…

可視化應用:提升教育領域的學習與理解

在教育領域&#xff0c;可視化應用作為一種強大的工具&#xff0c;已經開始發揮著重要的作用。通過將抽象的概念和復雜的數據轉化為直觀的圖形和圖表&#xff0c;可視化應用能夠提升學生的學習效果和理解能力。本文將探討可視化應用在教育領域中的重要性&#xff0c;以及它在不…

電路基礎之電容

電容器&#xff08;Capacitor&#xff09;是由兩個導體電極之間夾著一個電介質而組成的元件。這兩個電極可以是金屬板、箔片、涂層等&#xff0c;而電介質則是放置在電極之間的絕緣材料。電容器的基本構成包括以下幾個要素&#xff1a; 電極&#xff1a;電容器的電極是兩個導體…

Ubuntu系統kubeadm安裝K8S_v1.25.x容器使用docker(K8S_v1.24版本以后依然使用docker容器管理)

安裝所需要的全部文檔請點擊這里下載 系統是&#xff1a; rootk8s-master:~# cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE22.04 DISTRIB_CODENAMEjammy DISTRIB_DESCRIPTION“Ubuntu 22.04.3 LTS” rootk8s-master:~# uname -a Linux k8s-master 5.15.0-76-generi…

js合并數組對象(將數組中具有相同屬性對象合并到一起,組成一個新的數組)

一、根據數組對象中某一key值&#xff0c;合并相同key值的字段&#xff0c;到同一個數組對象中&#xff0c;組成新的數組 1.原數組&#xff1a; var array [{ id: 1, name: Alice },{ id: 2, name: Bob },{ id: 1, age: 25 },{ id: 3, name: Charlie, age: 30 } ];2.合并后數…

C++隱式調用和explicit關鍵字

隱式類型轉換 #include <iostream> using namespace std;class Point { public:int x, y;Point(int x 0, int y 0): x(x), y(y) {} };void displayPoint(const Point& p) {cout << "(" << p.x << "," << p.y <&l…