數據結構/PTA-符號配對/棧


請編寫程序檢查C語言源程序中下列符號是否配對:/**/()[]{}

輸入格式:

輸入為一個C語言源程序。當讀到某一行中只有一個句點.和一個回車的時候,標志着輸入結束。程序中需要檢查配對的符號不超過100個。

輸出格式:

首先,如果所有符號配對正確,則在第一行中輸出YES,否則輸出NO。然后在第二行中指出第一個不配對的符號:如果缺少左符號,則輸出?-右符號;如果缺少右符號,則輸出左符號-?

輸入樣例1:

void test()
{
    int i, A[10];
    for (i=0; i<10; i++) /*/
        A[i] = i;
}
.

輸出樣例1:

NO
/*-?

輸入樣例2:

void test() { int i, A[10]; for (i=0; i<10; i++) /**/ A[i] = i; }] . 

輸出樣例2:

NO ?-]

輸入樣例3:

void test() { int i double A[10]; for (i=0; i<10; i++) /**/ A[i] = 0.1*i; } . 

輸出樣例3:

YES

 

分析:

首先就是把串全部讀進來,合成一個大串,只保留包含符號即可

讀串時考慮使用函數getline,因為getline默認回車符停止讀入,按Ctrl+Z或鍵入EOF回車即可退出循環,方便書寫。

 

然后再對新生成的串處理:

如果讀入的是左括號,直接壓入棧頂。

如果讀入的是右括號:

1.如果棧為空,那么缺少與之對應的左括號。

2.如果棧頂元素與之不匹配,那么缺少與棧頂元素相匹配的右括號。

   對於不匹配的判斷:根據ASCII表,串中元素-棧頂元素!=1且!=2

 

 

3.處理完之后,如果棧為空,則表示完全匹配,如果有剩余,那么就是缺少右括號。因為是輸出第一個缺少的,所以直接輸出棧尾的元素就可以。

      判斷情況可提前設立一個flag

參考https://www.cnblogs.com/sykline/p/9748825.html      https://www.cnblogs.com/ymd12103410/p/9514896.html


 

代碼

#include<bits/stdc++.h>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char SElemType ;
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} STACK;
int  Pop(STACK &S)         //出棧
{
    if(S.top==S.base)
        return 0;
    *S.top,S.top--;
    return 1;
}
int Push(STACK &S,char e)  //入棧
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));;

        if(!S.base)
        {
            return -1;
        }
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return 1;
}
int StackEmpty(STACK& S)   //判斷是否棧空
{
    if(S.base == S.top)
        return 1;
    return -1;
}
int Gettop(STACK S,SElemType &e)  //返回棧頂元素
{
    if(S.top==S.base)
        return 0;
    e= *(S.top-1);
    return 1;
}
int InitStack(STACK &S)      //建立空棧
{
    S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!S.base)
        exit(-1);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return 1;
}

int main()
{
    string x,y="";
    int flag=1;
    while(getline(cin,x))               //輸入字符串
    {
        int i=0;

        if(x==".")
            break;
        for(; i<x.size(); i++)
        {
            if(x[i]=='['||x[i]==']'||x[i]=='{'||x[i]=='}'||x[i]=='('||x[i]==')')
                y+=x[i];
            else if(x[i]=='/'&&x[i+1]=='*')
            {
                y+="<";
                i++;
            }
            else if(x[i]=='*'&&x[i+1]=='/')   //注意:將*/視為>
            {
                y+=">";
                i++;
            }
        }
    }
    STACK S;
    InitStack(S);

    int i=0;
    for(; i<y.size(); i++)
    {
        char a;
        Gettop(S,a);
        if(y[i]=='['||y[i]=='{'||y[i]=='('||y[i]=='<') //以左包含的符號起始,入棧
        {
            Push(S,y[i]);
            continue;
        }
        else if(StackEmpty(S)==1)                      //以右包含的符號起始,直接報錯
        {

            printf("NO\n");
            if(y[i]=='>')
                printf("?-*/\n");
            else
                printf("?-%c\n",y[i]);
            flag=0;
            break;
        }
        else if(y[i]-a!=1&&y[i]-a!=2)
        {

            printf("NO\n");
            if(a=='<')
                printf("/*-?\n");
            else
                printf("%c-?\n",a);
            Pop(S);
            flag=0;
            i--;
            break;
        }
        else
            Pop(S);

    }
    if(flag==1)
    {
        if(StackEmpty(S)==1)
            printf("YES\n");
        else
        {
            char a;
            Gettop(S,a);
            printf("NO\n");
            if(a=='<')
                printf("/*-?\n");
            else
                printf("%c-?\n",a);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM