【day2】數據結構刷題 棧

一? 有效的括號

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

有效字符串需滿足:

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

示例 1:

輸入:s = ( )

輸出:true

示例 2:

輸入:s = ( ) [ ] { }

輸出:true

示例 3:

輸入:s = ( ]

輸出:false

示例 4:

輸入:s = ( [ ] )?

輸出:true

提示:

  • 1 <= s.length <= 104
  • s?僅由括號?'()[]{}'?組成

解題思路
1? 首先要排除兩種特殊的情況就是當這個括號為空或者首個括號就是閉括號的兩個情況
2? 這里是需要用到棧的思想,我的解答是沒有用到STL庫里面的給的棧,而是用了string類型
3? 當我遇到左括號的時候,我就用string的運算法則,把這個左括號放到最后面,當遇到右括號的時候,就進行匹配是不是右括號的左括號,如果不是就直接返回false
4? 最后我們還要檢查是不是所有的括號都進行了匹配,才可以返回true,否則就是返回false


代碼

class Solution {
public:bool isValid(string s) {if (s.empty()) return true;if (s[0] == ']' || s[0] == ')' || s[0] == '}') return false; int num1 = 0;string str = "";for (int i = 0; i < s.length(); i++) { if (s[i] == '(' || s[i] == '{' || s[i] == '[') {str.push_back(s[i]);num1++;} else {if (num1 == 0) return false; // 如果沒有開括號可匹配,返回 falsechar index = str.back(); str.pop_back(); num1--;// 判斷是否匹配if ((s[i] == ')' && index != '(') ||(s[i] == ']' && index != '[') ||(s[i] == '}' && index != '{')) {return false;}}}return num1 == 0; // 如果所有開括號都匹配上了,返回 true}
};

語法學習
string常用的功能
push_back( )? ? ?back( )? ? ?pop_back( )? ? ?empty( )? ? ?

二? 計算器

給定一個包含正整數、加(+)、減(-)、乘(*)、除(/)的算數表達式(括號除外),計算其結果。

表達式僅包含非負整數,+,?-?,*/?四種運算符和空格??。 整數除法僅保留整數部分。

示例 1:

輸入:"3+2*2"
輸出:7

示例 2:

輸入:" 3/2 "
輸出:1

示例 3:

輸入:" 3+5 / 2 "
輸出:5

說明:

  • 你可以假設所給定的表達式都是有效的。
  • 不要使用內置的庫函數?eval

解題思路
1? 把一個式子分成幾項來看,這樣就可以進行+和-的操作,比如5+6*8,這個就是把6*8看成一項
2? 我們要用一個字符來存儲這個一個式子的上一個運算符號,初始的運算符號要是+,這樣才可以進行初始化
代碼

#include <cctype>class Solution {
public:int calculate(string s) {int result = 0;  // 最終結果int num = 0;     // 當前數字int temp = 0;    // 臨時結果,用于處理乘除法char lastOp = '+';  // 上一個運算符,初始為 '+'for (int i = 0; i < s.length(); i++) {char c = s[i];// 如果是數字,累積到 numif (isdigit(c)) {num = num * 10 + (c - '0');}// 如果是運算符或者到達字符串末尾if ((!isdigit(c) && c != ' ') || i == s.length() - 1) {// 根據上一個運算符處理當前數字if (lastOp == '+') {result += temp;  // 將臨時結果累加到最終結果temp = num;      // 開始新的臨時結果} else if (lastOp == '-') {result += temp;  // 將臨時結果累加到最終結果temp = -num;     // 開始新的臨時結果(負數)} else if (lastOp == '*') {temp *= num;  // 乘法直接計算} else if (lastOp == '/') {temp /= num;  // 除法直接計算}// 更新上一個運算符lastOp = c;num = 0;  // 重置當前數字}}// 將最后的臨時結果累加到最終結果result += temp;return result;}
};

這個我們可以舉一個例子來進行解釋
例子3+2*2

我們的temp和result初始化一定是要為0,初始化的操作符是用來把第一個數字加到最初始的地方的
我們是把一整個式子拆分很多項來進行加,減法的時候直接讀取-num就好了,下一次加的時候就是減了

三? 設計棧

請設計一個棧,除了常規棧支持的pop與push函數以外,還支持min函數,該函數返回棧元素中的最小值。執行push、pop和min操作的時間復雜度必須為O(1)

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

解題思路,這個就是很簡單的棧的操作

#include <stdlib.h>
#include <limits.h>typedef struct {int* data;       // 動態數組存儲棧元素int maxsize;     // 棧的最大容量int num;         // 棧頂指針,初始化為-1
} MinStack;/** 初始化棧 */
MinStack* minStackCreate() {MinStack* temp = (MinStack*)malloc(sizeof(MinStack));temp->num = -1;temp->maxsize = 100;temp->data = (int*)malloc(temp->maxsize * sizeof(int));return temp;
}/** 壓入元素 */
void minStackPush(MinStack* obj, int x) {if (obj->num == obj->maxsize - 1) {// 棧滿時動態擴容obj->maxsize *= 2;obj->data = (int*)realloc(obj->data, obj->maxsize * sizeof(int));}obj->data[++(obj->num)] = x;
}/** 彈出元素 */
void minStackPop(MinStack* obj) {if (obj->num == -1) return; // 棧空時直接返回obj->num--;
}/** 獲取棧頂元素 */
int minStackTop(MinStack* obj) {if (obj->num == -1) return -1; // 棧空時返回特定值return obj->data[obj->num];
}/** 獲取棧中最小值 */
int minStackGetMin(MinStack* obj) {if (obj->num == -1) return -1; // 棧空時返回特定值int min = obj->data[0];for (int i = 0; i <= obj->num; i++) {if (obj->data[i] < min) {min = obj->data[i];}}return min;
}/** 釋放棧 */
void minStackFree(MinStack* obj) {free(obj->data);free(obj);
}

擴容的操作不要忘記了還有relloc這個函數,然后不斷地加這個索引進行賦予元素進入數組

總結
有效地括號
這個是利用string進行高效地操作,最關鍵的一步就是要不斷地取最后的那一個進行跟閉括號進行比對,從而得出結果
情況1? 沒有元素
情況2? 開始就是閉括號
情況3? 沒有全部處理完

計算器
要把計算器的的result和lastop和num都初始化為0,然后進行分項,分別利用加法加入到result里面
情況1? 在過程進行相加
情況2? 在末尾進行相加
乘法和除法可以先用項來進行保存,然后后面遇到加法和減法的時候就直接加這個項數了

設計棧
這里的操作跟我們一般的棧操作差不多
我們要設計出一個可以擴棧的操作可以利用relloc這個函數

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

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

相關文章

藍橋杯 勁舞團

問題描述 小藍最近迷上了一款名為 “勁舞團” 的游戲。 在游戲中&#xff0c;只要按照給出的鍵位提示依次按出對應的鍵位&#xff0c;游戲人物便可以跟隨節奏跳舞。 對于連續的 K 次正確敲擊&#xff0c;如果任意連續兩次敲擊之間的時間間隔都小于等于 1 秒&#xff08;即 1…

數據庫數值函數詳解

各類資料學習下載合集 ??https://pan.quark.cn/s/8c91ccb5a474?? 數值函數是數據庫中用于處理數值數據的函數,可以用于執行各種數學運算、統計計算等。數值函數在數據分析及處理時非常重要,能夠幫助我們進行數據的聚合、計算和轉換。在本篇博客中,我們將詳細介紹常用的…

關于金融開發領域的一些專業知識總結

目錄 1. 交易生命周期 1.1 證券交易所 1.1.1 交易前 1) 訂單生成&#xff08;Order Generation&#xff09; 2) 訂單管理&#xff08;Order Management&#xff09; 1.1.2 交易執行 3) 交易匹配&#xff08;Trade Matching&#xff09; 1.1.3 交易后 4) 交易確認&…

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3495. Minimum Operations to Make Array Elements Zero 1. 解題思路 這一題的話核心就是統計對任意自然數 n n n&#xff0c;從 1 1 1到 n n n當中所有的數字對…

Vue 3 + TypeScript 實現視頻播放與字幕功能:集成西瓜播放器 XGPlayer

文章目錄 1. 前言&#xff1a;視頻播放器的重要性2. 準備工作2.1 安裝 Vue 3 項目2.2 安裝 XGPlayer 和相關依賴 3. 實現視頻播放3.1 初始化 XGPlayer 4. 添加字幕功能4.1 配置字幕 4.2 字幕文件格式5. 增加交互性完整的代碼&#xff0c;僅供參考6. 總結 在現代 Web 開發中&…

MacOS安裝 nextcloud 的 Virtual File System

需求 在Mac上安裝next cloud實現類似 OneDrive 那樣&#xff0c;文件直接保存在服務器&#xff0c;需要再下載到本地。 方法 在 官網下載Download for desktop&#xff0c;注意要下對版本&#xff0c;千萬別下 Mac OS默認的那個。 安裝了登錄在配置過程中千萬不要設置任何同…

.NET 9 徹底改變了 API 文檔:從 Swashbuckle(Swagger) 到 Scalar

示例代碼下載&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文檔是現代軟件開發的支柱。隨著 .NET 9 從 Swashbuckle 轉向 Microsoft.AspNetCore.OpenApi&#xff0c;開發人員需要新的策略來保持高效。本文探討了這些變化&#xff0c;并介…

深入剖析Java虛擬機(JVM):從零開始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;為什么每個Java開發者都要懂JVM&#xff1f; 想象你是一名賽車手&#xff0c;Java是你的賽車&#xff0c;而JVM就是賽車的引擎。 雖然你可以不關心引擎內部構造就能開車&#xff0c;但要想在比賽中獲勝&#xff0c;必須了解引擎如何工作&#…

怎么連接linux服務器的桌面

一、使用 VNC&#xff08;Virtual Network Computing&#xff09; 1. 服務器端配置&#xff08;Ubuntu 22.04 示例&#xff09; # 安裝 VNC 服務器&#xff08;以 TigerVNC 為例&#xff09; sudo apt update sudo apt install tigervnc-standalone-server tigervnc-xorg-ext…

elasticsearch 通用筆記

文章目錄 一、前言二、內容說明1、目錄簡介2、本文例子前提內容 三、操作內容1、設置ES為服務2、查看健康度參數解析 3、索引相關查詢3.1、查詢指定索引內容3.1.1、匹配查詢3.1.2、精確匹配&#xff08;不嘗試分詞&#xff09;3.1.3、范圍查詢3.1.4、id查詢3.1.5、通配符及前綴…

windows安裝配置FFmpeg教程

1.先訪問官網&#xff1a;https://www.gyan.dev/ffmpeg/builds/ 2.選擇安裝包Windows builds from gyan.dev 3. 下滑找到release bulids部分&#xff0c;選擇ffmpeg-7.0.2-essentials_build.zip 4. 然后解壓將bin目錄添加path系統變量&#xff1a;\ffmpeg-7.0.2-essentials_bui…

強大的AI網站推薦(第二集)—— V0.dev

網站&#xff1a;V0.dev 號稱&#xff1a;前端開發神器&#xff0c;專為開發人員和設計師設計&#xff0c;能夠使用 AI 生成 React 代碼 博主評價&#xff1a;生成的UI效果太強大了&#xff0c;適合需要快速創建UI原型的設計師和開發者 推薦指數&#xff1a;&#x1f31f;&…

c#知識點補充4

1.發布者訂閱模式 發布者 訂閱者 倆者直接的關聯使用

01、聊天與語言模型

一、簡單說明模型 LLM目前有兩種API提供 LanguageModel&#xff1a;接收一個a作為輸入并返回一個b作為輸出&#xff0c;這種是已經過時的ChatLanguageModel&#xff1a;接收多個輸入&#xff0c;然后返回相應的輸出 ChatLanguaggeModel是LangChain4j中LLM交互低級API&#x…

SQL的DCL,DDL,DML和DQL分別是什么

SQL&#xff08;Structured Query Language&#xff09;包括以下四種主要語言類別&#xff0c;分別用于不同的數據庫操作&#xff1a; 1. DCL&#xff08;Data Control Language&#xff0c;數據控制語言&#xff09; 用于控制數據庫訪問權限和安全。 常見命令&#xff1a; …

spring boot maven一欄引入本地包

1、在項目跟目錄下建立文件夾&#xff0c;比如libs 2、maven依賴 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope>&l…

連續型隨機變量及其分布

連續型隨機變量 數學公式可以看作一門精確描述事物的語言&#xff0c;比語言尤其是漢語的模糊性精確多了&#xff01;離散型數據的處理可以通過枚舉和相加進行處理。而連續型數據則沒有辦法這樣處理。我們必須要通過函數和取值區間還有微積分計算。 &#xff3b;定義1&#x…

AI重構SEO關鍵詞優化路徑

內容概要 人工智能技術的深度應用正在推動SEO優化進入全新階段。傳統關鍵詞優化依賴人工經驗與靜態規則&#xff0c;存在效率瓶頸與策略滯后性缺陷。AI技術通過智能語義分析系統&#xff0c;能夠穿透表層詞匯限制&#xff0c;精準捕捉用戶搜索意圖的語義關聯網絡&#xff0c;結…

turnjs圖冊翻書效果

npm install https://github.com/igghera/turn.js.git //或者 npm install turn.js //import $ from "jquery"; //記得引入jquery import turn.js; // 引入 Turn.jsimport turn from "/utils/turn.min.js";// 引入 Turn.jsinitBook(length) {var that thi…

用PostgreSQL玩轉俄羅斯方塊:當SQL成為游戲引擎

當DBA開始摸魚2025年某深夜&#xff0c;一位不愿透露姓名的DBA為了在監控大屏上隱藏游戲行為&#xff0c;竟用SQL實現了俄羅斯方塊&#xff01;從此&#xff0c;SELECT成了方向鍵&#xff0c;UPDATE成了旋轉指令&#xff0c;DELETE成了消除大招。本文將揭秘這個瘋狂項目的技術內…