1. 程式人生 > 其它 >洛谷題解 P1739 表示式括號匹配

洛谷題解 P1739 表示式括號匹配

題目描述

假設一個表示式有英文字母(小寫)、運算子(+,—,*,/)和左右小(圓)括號構成,以“@”作為表示式的結束符。請編寫一個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表示式長度小於255,左圓括號少於20個。
輸入格式
一行:表示式
輸出格式
一行:“YES” 或“NO”
輸入輸出樣例
輸入 #1
2(x+y)/(1-x)@
輸出 #1
YES
輸入 #2
(25+x)
(a*(a+b+b)@
輸出 #2
NO
說明/提示
表示式長度小於255,左圓括號少於20個

解題方法:

我們可以使用棧來解題。如果讀入一個左括號,則一定有一個右括號與其匹配。那麼,如果有左括號,把左括號壓入棧。如果有右括號,那麼把棧頂的左括號彈出棧。到最後,如果棧中什麼都沒有,說明表示式括號匹配。否則,如果棧有剩餘的括號,就不匹配,例如序列(()。如果棧中已經沒有括號了,但是讀入一個右括號,也是出錯的,例如序列())。

程式碼

#include<bits/stdc++.h>
using namespace std;
int main(){
    stack<char>stk;
    int c;
    for(;;){
        c=getchar();
        if(c=='@'){
            if(stk.size()==0)cout<<"YES";
            else cout<<"NO";
            return 0;
        }
        else if(c=='(')stk.push(c);
        else if(c==')'){
            if(stk.size()==0){
                cout<<"NO";
                return 0;
            }
            if(stk.top()=='(')stk.pop();
        }
    }
}