假設乙個表示式有英文本母(小寫)、運算子(+,—,,/)和左右小(圓)括號構成,以「@」作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回「yes」;否則返回「no」。表示式長度小於255,左圓括號少於20個。一開始我是這樣做的,利用堆疊的鏈式結構,左括號入棧,右括號出棧,最後判斷棧是否為空,為空的話說明匹配。輸入輸出格式
輸入格式:
一行:表示式
輸出格式:
一行:「yes」 或「no」
輸入輸出樣例
輸入樣例#1:
2(x+y)/(1-x)@
輸出樣例#1:
yes輸入樣例#2:
(25+x)(a(a+b+b)@
輸出樣例#2:
no
#include
#include
#include
using namespace std;
intmain()
while
( c !=
'@')
cin >> c;}if
( s.
empty()
) cout <<
"yes"
cout <<
"no"
}
不知道為啥,有個資料沒通過,實在找不出問題,我又換了另一種方式。
#include
using namespace std;
intmain()
while
(c !=
'@')
if( a ==0)
cout <<
"yes"
cout <<
"no"
<}
當然我又發現我犯了乙個致命的問題,括號匹配,而我只是判斷了輸入的表示式裡左括號和右括號的數量相等,也就是可能右括號全在前面,左括號在後面的問題,所以此方法refuse。
所以想想是要對前面一種方法進行改進一下;
#include
using namespace std;
intmain()
while
(c !=
'@')
else
} cin >> c;}if
( a ==0)
cout <<
"yes"
cout <<
"no"
}
增加乙個條件,就是保證左括號的數量大於0的時候再進行右括號的匹配,如果左括號的數量為0,這時候出現了右括號的話,那當然不匹配,程式不用往下繼續了。
這種題目我第一反應是堆疊的知識,但洛谷大神出題刁鑽,有乙個資料怎麼都通不過,感覺可能是我的哪個地方有點小問題,堆疊的思想肯定是沒錯的,但是本蒟蒻沒全對。之後就想一下利用計數器來記錄左右括號的數量,做乙個匹配,這裡面要注意乙個問題,就是左括號的永遠在前面,不能僅僅做簡單的計數。
洛谷P1739 表示式括號匹配
表示式括號匹配 題目描述 表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於255,左圓括號少於20個。分析 用類似棧的方法做,從前往後記錄左括號出現個數,每找到乙個右...
洛谷 P1739 表示式括號匹配
假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於 255,左圓括號少於 20個。輸入格式 一行 表示式 輸出格式 一行 yes 或 no 輸入樣例 1 複製2...
洛谷P1739 表示式括號匹配
假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回 yes 否則返回 no 表示式長度小於255,左圓括號少於20個。輸入格式 一行 表示式 輸出格式 一行 yes 或 no 輸入樣例 1 2 x y...