洛谷題 P1739 表示式括號匹配(堆疊)

2021-09-24 16:52:22 字數 1563 閱讀 9059

假設乙個表示式有英文本母(小寫)、運算子(+,—,,/)和左右小(圓)括號構成,以「@」作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回「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...