日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 有效的括号

發(fā)布時間:2023/12/9 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 有效的括号 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

有效字符串需滿足:

左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。

示例 1:

輸入:s = "()" 輸出:true

示例 2:

輸入:s = "()[]{}" 輸出:true

示例 3:

輸入:s = "(]" 輸出:false

示例 4:

輸入:s = "([)]" 輸出:false

示例 5:

輸入:s = "{[]}" 輸出:true

方法1.棧

判斷括號的有效性可以使用「棧」這一數(shù)據(jù)結(jié)構(gòu)來解決。

我們遍歷給定的字符串 s。當(dāng)我們遇到一個左括號時,我們會期望在后續(xù)的遍歷中,有一個相同類型的右括號將其閉合。由于后遇到的左括號要先閉合,因此我們可以將這個左括號放入棧頂。

當(dāng)我們遇到一個右括號時,我們需要將一個相同類型的左括號閉合。此時,我們可以取出棧頂?shù)淖罄ㄌ柌⑴袛嗨鼈兪欠袷窍嗤愋偷睦ㄌ枴H绻皇窍嗤念愋?#xff0c;或者棧中并沒有左括號,那么字符串 s 無效,返回 false。

bool isValid(string s) {if (s.size() % 2 == 1)return false;if (s.size() == 0)return true;stack<char> brackets;for (char c : s) {if (c == '(' || c == '{' || c == '[')brackets.push(c);else if (brackets.empty()){printf("false");return false;} else if (c == ')') {char cnow = brackets.top();if (cnow == '(')brackets.pop();else{printf("false");return false;} }else if (c == '}') {char cnow = brackets.top();if (cnow == '{')brackets.pop();else{printf("false");return false;}}else {char cnow = brackets.top();if (cnow == '[')brackets.pop();else{printf("false");return false;}}}printf("true");return brackets.empty(); }

方法2.replace函數(shù)

這是我在一篇博客中看到的方法,通過replace函數(shù)替代其中成對的括號,最后判斷字符串是否還有剩余。

原代碼是Java的代碼,如下:

public boolean isValid(String s) {//假如長度是1或者不為偶數(shù)if(s.length()<2||s.length()%2!=0){if(s.isEmpty()){return true;}else{return false;}}int count = 0;int length = s.length();//循環(huán)替換,最大次數(shù)為s.length()/2while(count<length/2){s = s.replace("{}","").replace("[]","").replace("()","");count++;}//假如循環(huán)替換完,還有值,那么肯定就不是對稱結(jié)構(gòu)if(s.length()>0){return false;}else{return true;}}

隨后我查看了C++中也有replace函數(shù)的聲明,頭文件為string。根據(jù)另一篇博客中對于replace函數(shù)的使用介紹修改了上面的代碼,修改后的代碼如下:

bool isValid2(string s) {//假如長度是1或者不為偶數(shù)if (s.length() < 2 || s.length() % 2 != 0) {if (s.empty()) {return true;}else {return false;}}int count = 0;int length = s.length();//循環(huán)替換,最大次數(shù)為s.length()/2while (count < length / 2) {//s = s.replace("{}",2, " ").replace("[]", "").replace("()", "");//s = s.replace("{}", 2, " ");s = s.replace(s.find("{"), 1, "t");//s = s.replace(s.find("[]"), 2, " ");//s = s.replace(s.find("()"), 2, " ");count++;}//假如循環(huán)替換完,還有值,那么肯定就不是對稱結(jié)構(gòu)if (s.length() > 0) {printf("false");return false;}else {printf("true");return true;} }

但是這里遇到了一個問題:

s = s.replace(s.find("{"), 1, "t");

這行代碼中我在s.find中查找括號時程序調(diào)試時會報(bào)錯:

但是例如我給一個字母進(jìn)行查找替換則不會出現(xiàn)問題。例如我給一個字符串然后讓其查找a并用t替換:
s = s.replace(s.find(“a”), 1, “t”);

所以這里我不確定是C++中的replace函數(shù)不支持查找括號還是我這里的寫法有問題。但是看到挺多地方提到Java中可以使用該函數(shù)解這道題。

整體代碼如下:

#include <iostream> #include <cstdlib> #include <ctime> #include <stack> #include <string> using namespace std;bool isValid(string s) {printf("輸入為:%s\n", s.c_str());if (s.size() % 2 == 1)return false;if (s.size() == 0)return true;stack<char> brackets;//for (char c : s)這是C++11中新增的一種循環(huán)寫法,對數(shù)組(或容器類,如vector和array)的每個元素執(zhí)行相同的操作,此外string類也支持這種對字符的遍歷循環(huán)操作。//for(double x:prices)。x最初表示數(shù)組prices的第一個元素,顯示第一個元素后,不斷執(zhí)行循環(huán),而x依次表示數(shù)組的其他元素。for (char c : s) {if (c == '(' || c == '{' || c == '[')brackets.push(c);else if (brackets.empty()){printf("結(jié)果為:false");return false;} else if (c == ')') {char cnow = brackets.top();if (cnow == '(')brackets.pop();else{printf("結(jié)果為:false");return false;} }else if (c == '}') {char cnow = brackets.top();if (cnow == '{')brackets.pop();else{printf("結(jié)果為:false");return false;}}else {char cnow = brackets.top();if (cnow == '[')brackets.pop();else{printf("結(jié)果為:false");return false;}}}printf("結(jié)果為:true");return brackets.empty(); }//bool isValid2(string s) { // //假如長度是1或者不為偶數(shù) // if (s.length() < 2 || s.length() % 2 != 0) { // if (s.empty()) { // return true; // } // else { // return false; // } // } // int count = 0; // int length = s.length(); // //循環(huán)替換,最大次數(shù)為s.length()/2 // while (count < length / 2) { // //s = s.replace("{}",2, " ").replace("[]", "").replace("()", ""); // //s = s.replace("{}", 2, " "); // s = s.replace(s.find("{"), 1, "t"); // //s = s.replace(s.find("[]"), 2, " "); // //s = s.replace(s.find("()"), 2, " "); // count++; // } // //假如循環(huán)替換完,還有值,那么肯定就不是對稱結(jié)構(gòu) // if (s.length() > 0) // { // printf("false"); // return false; // } // else { // printf("true"); // return true; // } //} bool replace(string str) {str = str.replace(str.find("a"), 2, "#");printf("\n");cout <<"輸入:"<< str << endl;return 0; } int main() {string res = "[{((}]";//string res = "aacabd";string str = "he is@ a@ good boy";int n = 16;//數(shù)組元素的個數(shù),即生成隨機(jī)數(shù)的個數(shù)int target = 30;//int a[16];isValid(res);replace(str);//Random(a, n, 1, 19);//生成隨機(jī)數(shù)的通常范圍為0~32767,這里通過取模控制取值為0~100 //search(a, n, target);//printf("%s %d",a, n);return 0; }

效果如下:

參考:
https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/

https://blog.csdn.net/qq_38455201/article/details/82887217

https://blog.csdn.net/wuxiecsdn/article/details/114589773

https://blog.csdn.net/qian2213762498/article/details/79530974

https://leetcode-cn.com/problems/valid-parentheses/

總結(jié)

以上是生活随笔為你收集整理的C++ 有效的括号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。