描述
假设表达式中允许包含两种括号:圆括号和方括号。编写一个算法判断表达式中的括号是否正确配对。
input
由括号构成的字符串,包含”(“、”)“、”[“和”]“。
output
如果匹配输出YES,否则输出NO。
样例输入
[([][]())]
样例输出
YES
这道题的思路是遇到左括号就入栈,遇到右括号就让栈顶元素出栈匹配,若匹配成功继续,若不成功则输出NO,若将字符串扫描完毕栈不为空,则说明匹配不成功
代码如下
1 #include<iostream> 2 #include<algorithm> 3 #include<memory.h> 4 #include<string.h> 5 using std::cin; 6 using std::cout; 7 using std::endl; 8 using std::sort; 9 10 #define N 100 11 struct Stack { 12 char date[N]; 13 int top; 14 } stack; 15 //栈初始化 16 void init(Stack *stack) { 17 stack->top=-1; 18 memset(stack->date,0,sizeof(char)*N);//数据清零 19 } 20 21 bool isempty(Stack*stack) { //判断是否为空 22 return stack->top==-1; 23 } 24 bool isfull(Stack*stack)//判断栈溢出 25 { 26 return stack->top==N-1; 27 } 28 int gettop(Stack*stack)//获取栈顶 29 { 30 return stack->date[stack->top]; 31 } 32 void push(Stack*stack,char a)//压栈 33 { 34 if(isfull(stack)){ 35 return; 36 }else{ 37 stack->top++; 38 stack->date[stack->top]=a; 39 } 40 41 } 42 void pop(Stack*stack)//吐 43 { 44 if(isempty(stack)){ 45 return; 46 }else{ 47 stack->top--; 48 } 49 } 50 bool isleft(char a){ 51 return (a=='(')||(a=='['); 52 } 53 bool isright(char a){ 54 return (a==']')||(a==')'); 55 } 56 bool juge(char a,char b){ 57 return (a=='('&&b==')')||(a=='['&&b==']'); 58 } 59 int main(){ 60 Stack stack; 61 init(&stack); 62 char str[100]; 63 cin>>str; 64 int len=strlen(str); 65 for(int i=0;i<len;i++){ 66 if(isleft(str[i])){ 67 push(&stack,str[i]); 68 }else { 69 if(isright(str[i])){ 70 if(!juge(stack.date[stack.top],str[i])){ 71 cout<<"NO"; 72 return 0; 73 } 74 pop(&stack); 75 } 76 } 77 } 78 cout<<"YES"; 79 return 0; 80 } 81 82