1. 程式人生 > >陣列模擬棧解決括號匹配

陣列模擬棧解決括號匹配

  這三道題其實是一個型別,難度依次遞增,所以博主直接講最後一道,前面兩道直接給程式碼。

表示式括號匹配(stack)

時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 133 通過數: 90
【題目描述】
假設一個表示式有英文字母(小寫)、運算子(+,—,*,/)和左右小(圓)括號構成,以“@”作為表示式的結束符。請編寫一個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表示式長度小於255,左圓括號少於20個。

【輸入】
一行資料,即表示式。

【輸出】
一行,即“YES” 或“NO”。

【輸入樣例】
2*(x+y)/(1-x)@
【輸出樣例】
YES

#include<cstdio>
using namespace std;
char x[1000];
int main()
{
    int top=0;
    while(true)
    {
        char p;
        scanf("%c",&p);
        if(p=='@')
        {
            break;
        }
        if(p=='(')
        {
            top++;
        }
        if(p==')')
        {
            top--;
        }
    }
    if
(top!=0) { printf("NO"); } else { printf("YES"); } return 0; }

括弧匹配檢驗

時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 232 通過數: 70
【題目描述】
假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,如([ ]())或[([ ][ ])]等為正確的匹配,[( ])或([ ]( )或 ( ( ) ) )均為錯誤的匹配。

現在的問題是,要求檢驗一個給定表示式中的括弧是否正確匹配?

輸入一個只包含圓括號和方括號的字串,判斷字串中的括號是否匹配,匹配就輸出 “OK” ,不匹配就輸出“Wrong”。輸入一個字串:[([][])],輸出:OK。

【輸入】
輸入僅一行字元(字元個數小於255)。

【輸出】
匹配就輸出 “OK” ,不匹配就輸出“Wrong”。

【輸入樣例】
[(])
【輸出樣例】
Wrong

#include<cstdio>
#include<cstring>
using namespace std;
char left[300];
int main()
{
    char ch[300];
    int top=-1,p;
    scanf("%s",ch);
    int k=strlen(ch);
    for(int i=0;i<k;i++)
    {
        if(ch[i]=='('||ch[i]=='[')
        {
            top++;
            left[top]=ch[i];
        }
        if(ch[i]==')')
        {
            if(left[top]=='(')
            {
                top--;
            }
            else
            {
                printf("Wrong");
                return 0;
            }
        }
        if(ch[i]==']')
        {
            if(left[top]=='[')
            {
                top--;
            }
            else
            {
                printf("Wrong");
                return 0;
            }
        }
    }
    if(top!=-1)
    {
        printf("Wrong");
        return 0;
    }
    printf("OK");
    return 0;
}

字串匹配問題(strs)

時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 164 通過數: 54
【題目描述】
字串中只含有括號 (),[],<>,{},判斷輸入的字串中括號是否匹配。如果括號有互相包含的形式,從內到外必須是<>,(),[],{},例如。輸入: [()] 輸出:YES,而輸入([]),([)]都應該輸出NO。

【輸入】
第一行為一個整數n,表示以下有多少個由括好組成的字串。接下來的n行,每行都是一個由括號組成的長度不超過255的字串。

【輸出】
在輸出檔案中有n行,每行都是YES或NO。

【輸入樣例】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
 ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【輸出樣例】
YES
YES
YES
YES
NO

大體思路:直接讀入字串,將左括號存入棧裡,存入時比較與前一個括號的大小關係是否合法,合法則存入,top加一;如果遇到右括號則比較棧頂元素,匹配則首指標top減一。
這裡博主在讀入時將四種括號分為四級,方便比較,除以10可得到等級,對10取模得知左/右括號

#include<cstdio>
#include<cstring>
using namespace std;
int ch[300];
int str[300];
int top=0;
int in()
{
    char x[300];
    scanf("%s",x);
    int k=strlen(x);
    for(int i=0;i<k;i++)
    {
        if(x[i]=='{')
        {
            ch[i+1]=41;
            continue;
        }
        if(x[i]=='}')
        {
            ch[i+1]=42;
            continue;
        }
        if(x[i]=='[')
        {
            ch[i+1]=31;
            continue;
        }
        if(x[i]==']')
        {
            ch[i+1]=32;
            continue;
        }
        if(x[i]=='(')
        {
            ch[i+1]=21;
            continue;
        }
        if(x[i]==')')
        {
            ch[i+1]=22;
            continue;
        }
        if(x[i]=='<')
        {
            ch[i+1]=11;
            continue;
        }
        if(x[i]=='>')
        {
            ch[i+1]=12;
            continue;
        }
    }
    return k;
}
bool check(int k)
{
    for(int i=1;i<=k;i++)
    {
        if(ch[i]%10==1)
        {
            if(str[top]>=ch[i])
            {
                top++;
                str[top]=ch[i];
            }
            else
            {
                return false;
            }
        }
        if(ch[i]%10==2)
        {
            if(str[top]/10==ch[i]/10)
            {
                top--;
            }
            else
            {
                return false;
            }
        }
    }
    if(top!=0)
    {
        return false;
    }
    return true;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        str[0]=100;
        int k=in();
        if(check(k))
        {
            printf("YES\n");
            continue;
        }
        printf("NO\n");
        top=0;
        memset(ch,0,sizeof(ch));
        memset(str,0,sizeof(str));
    }
    return 0;
}