括号匹配问题(0962)

描述

假设表达式中允许包含两种括号:圆括号和方括号。编写一个算法判断表达式中的括号是否正确配对。

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  
原文地址:https://www.cnblogs.com/swust-wangyf/p/6725196.html