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