時間限制:1 秒 記憶體限制:32 兆 特殊判題:否括號匹配問題是堆疊的乙個典型應用。題目描述:
在某個字串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何乙個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫乙個程式,找到無法匹配的左括號和右括號,輸出原來字串,並在下一行標出不能匹配的括號。不能匹配的左括號用
"$"
標註,不能匹配的右括號用"?"
標註.輸入:輸入包括多組資料,每組資料一行,包含乙個字串,只包含左右括號和大小寫字母,字串長度不超過100。
輸出:對每組輸出資料,輸出兩行,第一行包含原始輸入字元,第二行由
"$"
,"?"
和空格組成,"$"
和"?"
表示與之對應的左括號和右括號不能匹配。
每乙個右括號與在其之前所有未被匹配的左括號中最靠右的乙個匹配。
若按照從左至右的順序遍歷字串,並將遇到的所有左括號都放入堆疊中等待匹配;若在遍歷過程中遇到乙個右括號,由於按照從左向右的順序遍歷字串,若此時堆疊非空,那麼棧頂左括號即為與其匹配的左括號;相反,若堆疊為空,則表示在其之前不存在未被匹配的左括號,匹配失敗。
#include #include using namespace std;
stacks; //定義乙個堆疊
char str[110]; //儲存輸入字串
char ans[110]; //儲存輸出字串
int main()
else if (str[i] == ')') else ans[i] = '?'; //若堆疊為空,則無法找到左括號與其匹配,修改輸出中該位置為?
}else ans[i] = ' '; //若其為其它字元,與括號匹配無關,則修改輸出為空格
}while(!s.empty())
ans[i] = '\0'; //或ans[i]=0,為了使輸出形成字串,在其最後乙個字元後新增乙個空字元
puts(str); //輸出原字串
puts(ans); //輸出答案字串
}return 0;
}
'\0'
是轉譯字元,意思是告訴程式這不是字元0,而是數字0的2進製直接放進來,'\0'
就是8位的00000000,也就是ascii碼表中的第0號,表示空字元(null),因為ascii碼的字元0不是00000000,而是00110000 (十進位制48)
c語言中沒有專門的字串變數,通常用乙個字元陣列來存放乙個字串。字串總是以'\0'
作為串的結束符。因此當把乙個字串存入乙個陣列時,也把結束符'\0'
存入陣列,並以此作為該字串是否結束的標誌。有了'\0'
標誌後,就不必再用字元陣列的長度來判斷字串的長度了。
把乙個字串賦值給陣列:char str1=;
實際上陣列str1在記憶體中的實際存放情況為:
c x j r . 2 1 i c . o r g '\0'
這後面的'\0'
是由c編譯系統自動加上的。所以在用字串賦初值時一般無須指定陣列的長度, 而由系統自行處理。 把字元陣列str1中的字串拷貝到字元陣列str2中,串結束標誌'\0'
也一同拷貝。
但也有一些例外情況發生:
比如當陣列長度不夠。假設指定了陣列長度,如:char str1[13]=;
由於字元組str1的長度為13,所以後面的資訊會丟失,即'\0'
丟失。
另外如果在給陣列賦值時,把每個字元單獨用引號括起來也會丟失'\0'
。如:
char str1=;
如果希望陣列以'\0'
結束,則寫成:
char str1=;
或寫成(人工新增'\0'
):
char str1=;
或寫成(故意給陣列預留乙個空位):
char str1[14]=;
題目 26 括號匹配問題
題目描述 在某個字串 長度不超過 100 中有左括號 右括號和大小寫字母 規定 與常見的 算數式子一樣 任何乙個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫乙個程 序,找到無法匹配的左括號和右括號,輸出原來字串,並在下一行標出不能匹配的括號。不能匹配的左括號用 標註,不能匹配的右括號用 標註...
Day of week 九度教程第7題
其大意為,輸入乙個日期,要求輸出該日期為星期幾。星期幾是以七為週期迴圈的,那麼只需要知道 1.今天是星期幾 2.今天和所給定的那天相隔幾天。利用其對7求餘數便可以知道所給定的那天是星期幾。include include define isleapyeap x x 100 0 x 4 0 x 400 ...
Sort 九度教程第11題
時間限制 1 秒 記憶體限制 128 兆 特殊判題 否 題目描述 給你n個整數,請按從大到小的順序輸出其中前m大的數。輸入 每組測試資料有兩行,第一行有兩個數n,m 0 include using namespace std bool cmp int x,int y int main 初始化,將每個...