1. 程式人生 > >洛谷 P1739 表達式括號匹配【STL/stack/模擬】

洛谷 P1739 表達式括號匹配【STL/stack/模擬】

stack clu b+ ack 編寫一個程序 輸入輸出格式 turn 是否 algorithm

題目描述
假設一個表達式有英文字母(小寫)、運算符(+,—,*,/)和左右小(圓)括號構成,以“@”作為表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回“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個

【STL】

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<set>
#include<sstream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<string.h>
using namespace std;
const int maxn = 1e5+5;
char s[maxn];
stack<char> st;
int main()
{
    cin>>s;
    for(int i=0; s[i]!='@'; i++)
    {
        if(s[i]=='(') st.push(s[i]);
        if(s[i]==')'){
            if(st.empty()){
                cout<<"NO"<<endl;
                return 0;
            }
            else st.pop();
        }
    }
    if(!st.empty()) printf("NO\n");
    else printf("YES\n");
    return 0;
}

【數組模擬】

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<set>
#include<sstream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<string.h>
using namespace std;
const int maxn = 1e5+5;
char s[maxn];
stack<char> st;
int main()
{
    int top=0;
    cin>>s;
    for(int i=0; s[i]!='@'; i++)
    {
        if(s[i]=='(') top++;
        if(s[i]==')'){
            if(top) top--;
            else {cout<<"NO"<<endl;return 0;}
        }
    }
    if(top) printf("NO\n");
    else printf("YES\n");
    return 0;
}

洛谷 P1739 表達式括號匹配【STL/stack/模擬】