輸入:第一行輸入一個數N(0<N<=100),表示有N組測試數據。後面的N行輸入多組輸入數據,每組輸入數據都是一個字符串S(S的長度小於10000,且S不是空串),測試數據組數少於5組。數據保證S中只含有"[","]","(",")"四種字符。數組
輸出:每組輸入數據的輸出佔一行,若是該字符串中所含的括號是配對的,則輸出Yes,若是不配對則輸出No測試
樣例輸入:spa
3
[(])
(])
([[]()])
樣例輸出:
No
No
Yes
這是南陽理工學院ACM練習題,個人程序以下:
在練習這道題時,我學會了①棧的知識和用法;②二維數組動態空間的開闢和釋放方法;③最重要的是學會了這種思惟方式,mark一下。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TRUE 1 #define FALSE 0 #define StackSize 10000 typedef struct{ char data[StackSize]; int top; }SqStack; int num1 = 0,num2 = 0; void InitStack(SqStack *s); int StackEmpty(SqStack *s); int StackFull(SqStack *s); int Push(SqStack *s,char x); char Pop(SqStack *s); int StackTop(SqStack *s,char *x); void Bracket(SqStack *s, char *a); int main(void) { int N = 0; int i = 0,j = 0,k = 0; int *length; char **s; SqStack S; scanf("%d",&N); //開闢二位數組動態內存空間,N行10000列 s = (char **)malloc(sizeof(char *)*N); for(i = 0;i < N;i++) s[i] = (char *)malloc(sizeof(char)*10000); for(i = 0;i < N;i++) { if('\n' == getchar()) { scanf("%s",s[i]); } } for(i = 0;i < N;i++) { Bracket(&S, s[i]); if(num1 == 0 && num2 == 0) { printf("YES\n"); } else printf("NO\n"); num1 = num2 = 0; } system("pause"); for(i = 0;i < N;i++) free(s[i]); free(s); return 0; } void Bracket(SqStack *s, char *a) { int i,j,length = strlen(a); InitStack(s); for(i = 0;i < length;i++) { switch(a[i]) { case '[':Push(s,a[i]);num1++;break; case '(':Push(s,a[i]);num2++;break; case ']': if('[' == Pop(s) || FALSE == Pop(s)) { num1--; } break; case ')': if('(' == Pop(s) || FALSE == Pop(s)) { num2--; } break; default:break; } } } void InitStack(SqStack *s) { s->top = -1; //初始化的順序棧爲空 } int StackEmpty(SqStack *s) { if(s->top == -1) return TRUE; else return FALSE; } int StackFull(SqStack *s) { if(s->top == StackSize-1) return TRUE; else return FALSE; } int Push(SqStack *s,char x) { if(StackFull(s)) { //printf("StackFull~\n"); return FALSE; } else { s->top++; s->data[s->top] = x; return TRUE; } } char Pop(SqStack *s) { if(StackEmpty(s)) { //printf("StackEmpty~\n"); return FALSE; } else { return s->data[s->top--]; } } int StackTop(SqStack *s,char *x) { if(StackEmpty(s)) { //printf("StackEmpty~\n"); return FALSE; } else { *x = s->data[s->top]; return TRUE; } }