程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 題目1072: 括號匹配問題

題目1072: 括號匹配問題

編輯:C++入門知識

題目描述 在某個字符串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何一個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫一個程序,找到無法匹配的左括號和右括號,輸出原來字符串,並在下一行標出不能匹配的括號。不能匹配的左括號用"$"標注,不能匹配的右括號用"?"標注。           輸入   輸入包括多組數據,每組數據一行,包含一個字符串,只包含左右括號和大小寫字母,字符串長度不超過100。 注意:cin.getline(str,100)最多只能輸入99個字符!           輸出 對每組輸出數據,輸出兩行,第一行包含原始輸入字符,第二行由"$","?"和空格組成,"$"和"?"表示與之對應的左括號和右括號不能匹配。           樣例輸入 bge))))))))) ((IIII)))))) ()()()()(uuu ))))UUUU((()         樣例輸出 bge)))))))))    ????????? ((IIII))))))         ???? ()()()()(uuu         $    ))))UUUU((() ????    $$           提示 [+] *** 提示已隱藏,點擊上方 [+] 可顯示 ***           來源 2010年北京大學計算機研究生機試真題         【思路】:     \   [cpp]  /*********************************    *    日期:2013-3-15   *    作者:SJF0115    *    題號: 天勤OJ 題目1072: 括號匹配問題   *    來源:http://www.acmclub.com/problem.php?id=1072   *    結果:AC    *    來源:2010年北京大學計算機研究生機試真題   *    總結:   **********************************/   #include<stdio.h>    #include<iostream>    #include<stack>    #include<string.h>    using namespace std;      int main(){       int i;       char str[101],Mark[101];       while(scanf("%s",str) != EOF){           stack<char> S;           for(i = 0;i < strlen(str);i++){               //如果是'('則入棧                if(str[i] == '('){                   //將數組下表暫存在棧中                    S.push(i);                   //對應輸出字符串暫且為' '                    Mark[i] = ' ';               }               else if(str[i] == ')'){                   //如果沒有'('相匹配                    if(S.empty()){                       //對應輸出字符串改為'?'                        Mark[i] = '?';                   }                   //有'('相匹配                    else{                       //對應輸出字符串改為' '                        Mark[i] = ' ';                       //棧頂位置左括號與其匹配,彈出已經匹配的左括號                        S.pop();                   }               }               //其他字符需許考慮,與括號無關                else{                   Mark[i] = ' ';                }           }//for            //若棧非空,則有沒有匹配的左括號            while(!S.empty()){               //對應輸出字符串改為'$'                Mark[S.top()] = '$';               S.pop();           }           Mark[i] = '\0';           //輸出            puts(str);           puts(Mark);       }       return 0;   }     /*********************************   *    日期:2013-3-15  *    作者:SJF0115   *    題號: 天勤OJ 題目1072: 括號匹配問題  *    來源:http://www.acmclub.com/problem.php?id=1072  *    結果:AC   *    來源:2010年北京大學計算機研究生機試真題  *    總結:  **********************************/ #include<stdio.h> #include<iostream> #include<stack> #include<string.h> using namespace std;   int main(){ int i; char str[101],Mark[101];     while(scanf("%s",str) != EOF){ stack<char> S; for(i = 0;i < strlen(str);i++){ //如果是'('則入棧 if(str[i] == '('){ //將數組下表暫存在棧中 S.push(i); //對應輸出字符串暫且為' ' Mark[i] = ' '; } else if(str[i] == ')'){ //如果沒有'('相匹配 if(S.empty()){ //對應輸出字符串改為'?' Mark[i] = '?'; } //有'('相匹配 else{ //對應輸出字符串改為' ' Mark[i] = ' '; //棧頂位置左括號與其匹配,彈出已經匹配的左括號 S.pop(); } } //其他字符需許考慮,與括號無關 else{ Mark[i] = ' ';  } }//for //若棧非空,則有沒有匹配的左括號 while(!S.empty()){ //對應輸出字符串改為'$' Mark[S.top()] = '$'; S.pop(); } Mark[i] = '\0'; //輸出 puts(str); puts(Mark); } return 0; }      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved