信息学奥赛一本通 1203:扩号匹配问题 | OpenJudge 2.2 2705:扩号匹配问题
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1203:扩号匹配问题 | OpenJudge 2.2 2705:扩号匹配问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目鏈接】
ybt 1203:擴(kuò)號(hào)匹配問(wèn)題
OpenJudge 2.2 2705:擴(kuò)號(hào)匹配問(wèn)題
【題目考點(diǎn)】
1. 遞歸
2. 棧
【解題思路】
解法1:遞歸
設(shè)sign字符數(shù)組,各元素初始值都是空格。sign[i]為$表示原字符串第i位置的左括號(hào)不匹配,sign[i]為?表示原字符串第i位置的右括號(hào)不匹配。將sign末尾添加’\0’,形成一個(gè)字符串。
設(shè)全局下標(biāo)si,表示當(dāng)前遍歷到的位置。
遍歷字符串:
- 如果遇到左括號(hào),就調(diào)用find()函數(shù)。
find()函數(shù)的作用為:使用si遍歷字符串,找到第一個(gè)右括號(hào)。- 如果找到左括號(hào),則遞歸調(diào)用find()函數(shù),找與這個(gè)左括號(hào)配對(duì)的右括號(hào)。
- 如果遇到右括號(hào),則結(jié)束調(diào)用。
- 如果si遍歷到末尾也沒(méi)有發(fā)現(xiàn)右括號(hào),說(shuō)明這個(gè)左括號(hào)沒(méi)法配對(duì)。那么在sign數(shù)組該左括號(hào)出現(xiàn)的位置標(biāo)記為$。
- 如果遇到右括號(hào),那么說(shuō)明該右括號(hào)無(wú)法配對(duì),在sign數(shù)組該右括號(hào)出現(xiàn)的位置標(biāo)記為?。
最后輸出字符數(shù)組sign
解法2:使用棧
用一個(gè)棧保存左括號(hào)的下標(biāo)。
遍歷字符串:
- 如果遇到左括號(hào),則入棧該左括號(hào)的下標(biāo)
- 如果遇到右括號(hào)
- 如果此時(shí)棧為空,說(shuō)明沒(méi)有左括號(hào)與這個(gè)右括號(hào)配對(duì),標(biāo)記這個(gè)位置為?
- 如果棧不空,出棧一個(gè)左括號(hào)的下標(biāo)。
遍歷結(jié)束后,如果棧不空,那么不斷出棧直至???。每個(gè)出棧的數(shù)字為一個(gè)無(wú)法配對(duì)的左括號(hào)的下標(biāo),標(biāo)記這些位置為$。
輸出標(biāo)記數(shù)組。
【題解代碼】
解法1:遞歸
#include <bits/stdc++.h> using namespace std; #define N 105 char s[N], sign[N]; int si, len; void find()//找下一個(gè)右括號(hào) 如果找到,si指向右括號(hào) 如果沒(méi)找到,做標(biāo)記 {int lp = si;//當(dāng)前左括號(hào)的下標(biāo) si++;while(si < len){if(s[si] == ')')return;else if(s[si] == '(')find();si++;}sign[lp] = '$';//沒(méi)有找到右括號(hào),左括號(hào)的位置標(biāo)記為$ } int main() {while(cin >> s){len = strlen(s);for(int i = 0; i < len; ++i)//初始化sign字符串為空格 sign[i] = ' ';sign[len] = '\0';si = 0;while(si < len){if(s[si] == ')')//右括號(hào)的位置標(biāo)記為? sign[si] = '?';else if(s[si] == '(')find();si++;}cout << s << endl << sign << endl;}return 0; }解法2:使用棧
#include <bits/stdc++.h> using namespace std; #define N 105 char s[N], sign[N]; int main() {while(cin >> s){stack<int> stk;int len = strlen(s);for(int i = 0; i < len; ++i)//初始化sign字符串為空格 sign[i] = ' ';sign[len] = '\0';for(int i = 0; i < len; ++i){if(s[i] == '(')stk.push(i);else if(s[i] == ')'){if(stk.empty())//右括號(hào)遇到棧空,該右括號(hào)不配對(duì) sign[i] = '?';elsestk.pop();}}while(stk.empty() == false)//最后棧中剩下的左括號(hào)的下標(biāo)指向的左括號(hào)沒(méi)有配對(duì) {sign[stk.top()] = '$';stk.pop();}cout << s << endl << sign << endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1203:扩号匹配问题 | OpenJudge 2.2 2705:扩号匹配问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 去除linux 文件中的控制字符,She
- 下一篇: 2021衢二中高考成绩查询入口,2021