請編寫程序檢查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); } } }
