c语言中 各种括号应成对出现,C语言::验证花括号成对出现
題目要求
編寫一個程序,它從標準輸入(終端)讀取C源代碼,并驗證所有的花括號都正確的成對出現。
注意:你不必擔心注釋內部、字符串常量內部和字符常量形式的花括號。
算法分析
我們先判斷左花括號的數量是否相等。
如果左右花括號數量不等,肯定不成對!
如果左右花括號數量相等,一定就成對嗎???
好像也不一定。
我們來舉例分析一下,左右花括號相等時可能會出現的情況:
1.{{{{{}}}}}(匹配)
2.{}{}{}{}{}(匹配)
...
3.}}}}}{{{{{(不匹配)
4.{{{{}}}}}{(不匹配)
......
第1種情況和第2種情況,屬于左右花括號數目相等且匹配的情況,所以我們不用分析。
第3種情況和第4種情況,屬于左右花括號數目相等但不匹配的情況,因此我們需要找出它們的共同點.
稍加分析我們就可以得出以下結論:
當右花括號出現時,如果左花括號的數目小于右花括號數目時,左右花括號必然不匹配.
可能有人對以上結論不理解,在此我再來詳細解釋一下:
(如果你表示已理解結論,請直接跳轉算法總結部分)
我們先來分析情況3:
當我們看到第一個右花括號時,發現它前面并沒有左花括號.
因此情況3必然屬于左右花括號不匹配的情況.
我們再來分析情況4:
我們看第1個右花括號,發現它前面有4個左花括號;
第2個右花括號,前面有4個左花括號
......
直到第5個右花括號,前面只有4個左花括號.
因此情況3也屬于左右花括號不匹配的情況.
算法總結
根據上面的分析,我們得出如下結論:
判斷左右花括號是否成對出現需要兩個條件:
1.左右花括號數目必須相等.
2.當右花括號出現時,左花括號數目必須大于右花括號.
算法轉程序
根據題目要求,首先我們需要從標準輸入獲得數據。
(不清楚這些函數功能的童鞋請直接點擊函數名稱)
scanf()函數和gets()函數都需要指定一個字符數組來做存儲。
如果用這兩個函數的話,那就必須得定義一個字符數組。
定義字符數組的話又會面臨數組溢出或者浪費空間等問題。
(數組定義小了,可能會溢出;定義大了,又會浪費空間.)
而getchar()函數每次只能從控制臺接受一個字符,因此我們需要用循環來操作。
所以,我們用getchar()函數通過循環操作,從標準輸入獲得數據。
于是便可以完成這樣的代碼:
//定義一個整型變量用來接收控制臺數據
int ch = 0;
//提示信息
printf("請輸入一段字符以ctrl+z結束:\n");
//從控制臺讀入字符并判斷是否滿足循環條件。
while((ch=getchar())!=EOF){
...//判斷左右花括號是否匹配的代碼
}
接下來我們開始寫分析左右花括號是否匹配的代碼。
根據,算法總結,我們可以設置兩個int型變量left和right,分別用來記錄左花括號的數量和右花括號的數量。
如果遇到左花括號,則left++;
如果如果遇到右花括號,我們首先得判斷左花括號的數目是否大于右花括號,right++;否則直接退出。
//定義一個整型變量用來接收控制臺數據
int ch = 0;
//定義一個整型變量用來計算左花括號數目
int left = 0;
//定義一個整型變量用來計算右花括號數目
int right = 0;
//提示信息
printf("請輸入一段字符以ctrl+z結束:\n");
//從控制臺讀入字符并判斷是否滿足循環條件。
while((ch=getchar())!=EOF){
//遇到左花括號,left+1
if(ch==’{’){
left++;
}
//遇到右花括號
if(ch==’}’){
//左花括號數目大于右花括號數目right+1
if(left>right){
right++;
}else{
//否則就是這種情況
//{{{{}}}}}{
//}}}}}{{{{{
//.....
//直接退出程序
printf("不匹配!\n");
return 0;
}
}
}
//如果程序能走到這里
//就已經排除}}}}{{{{這種特殊情況
//如果左花括號數目等于右花括號數目
if(right==left){
printf("匹配!\n");
}else{
printf("不匹配!\n");
}
最終的完整的代碼如下:
#include
int main(){
//定義一個整型變量用來接收控制臺數據
int ch = 0;
//定義一個整型變量用來計算左花括號數目
int left = 0;
//定義一個整型變量用來計算右花括號數目
int right = 0;
//提示信息
printf("請輸入一段字符以ctrl+z結束:\n");
//從控制臺讀入字符并判斷是否滿足循環條件。
while((ch=getchar())!=EOF){
//遇到左花括號,left+1
if(ch==’{’){
left++;
}
//遇到右花括號
if(ch==’}’){
//左花括號數目大于右花括號數目right+1
if(left>right){
right++;
}else{
//否則就是這種情況
//{{{{}}}}}{
//}}}}}{{{{{
//.....
//直接退出程序
printf("不匹配!\n");
return 0;
}
}
}
//如果程序能走到這里
//就已經排除}}}}{{{{這種特殊情況
//如果左花括號數目等于右花括號數目
if(right==left){
printf("匹配!\n");
}else{
printf("不匹配!\n");
}
return 0;
}
程序優化
寫到這里,好像就已經結束了?
其實....并沒有!
在上述程序中,我們用了兩個變量left和right來記錄左右花括號數目。
其實,我們并不需要知道left和right具體的值.
因此,我們可以用一個變量來記錄左右花括號的狀態.
我們定義一個整型變量count.
如果遇到左花括號,count++;
如果遇到右花括號,判斷count是否大于0,如果是count--,否則直接退出.
最終代碼如下:
#include
int main(){
//定義一個整型變量用來接收控制臺數據
int ch = 0;
//定義一個整型變量用來記錄左右花括號的狀態
int count = 0;
//提示信息
printf("請輸入一段字符以ctrl+z結束:\n");
//從控制臺讀入字符并判斷是否滿足循環條件。
while((ch=getchar())!=EOF){
//遇到左花括號,count++
if(ch==’{’){
count++;
}
//遇到右花括號
if(ch==’}’){
//左花括號數目大于右花括號數目right+1
if(count>0){
count--;
}else{
//否則就是這種情況
//{{{{}}}}}{
//}}}}}{{{{{
//.....
//直接退出程序
printf("不匹配!\n");
return 0;
}
}
}
//如果程序能走到這里
//就已經排除}}}}{{{{這種特殊情況
//如果左花括號數目等于右花括號數目
if(count==0){
printf("匹配!\n");
}else{
printf("不匹配!\n");
}
return 0;
}
看了本篇文章,如果你還不會如何用C語言來驗證花括號是否成對.....
請關注微信公眾號gxdydd,在微信公眾號下留言,有空我一定會回復的哦!
本文來自于高小調博客,如需轉載,請注明出處!
總結
以上是生活随笔為你收集整理的c语言中 各种括号应成对出现,C语言::验证花括号成对出现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 导入一个android项目需要改什么意思
- 下一篇: 在线斯诺克html5,用HTML 5打造