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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1203:扩号匹配问题 | OpenJudge 2.2 2705:扩号匹配问题

發布時間:2025/3/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 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:扩号匹配问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。