括号配对问题

1. 括号匹配的四种可能性:
①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确

2. 算法思想:
1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;
4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;
5.字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;

6.正常结束则括号匹配正确。


代码如下:

 

  1.   
  2. #include<iostream> 
  3. #include<string> 
  4. #include<string.h> 
  5. #include<algorithm> 
  6. #include<cstdio> 
  7. using namespace std; 
  8.  
  9. struct sStack 
  10.     char sign[10010]; 
  11.     int top; 
  12. }; 
  13.  
  14. void initstack(sStack &s) 
  15.     s.top = -1; 
  16.  
  17. bool isemptystack(sStack &s) 
  18.     return s.top == -1 ? 1 : 0; 
  19.  
  20. int pushstack(sStack &s, char c) 
  21.     s.sign[++s.top] = c; 
  22.     return 1; 
  23.  
  24. int popstack(sStack &s) 
  25.     if(isemptystack(s)) 
  26.         return 0; 
  27.     s.top--; 
  28.     return 1; 
  29.  
  30. char topstack(sStack &s) 
  31.     if(isemptystack(s)) 
  32.         return 0; 
  33.     return s.sign[s.top]; 
  34.  
  35. int main() 
  36.     int N, len, i; 
  37.     bool flag; 
  38.     char str[10010]; 
  39.     sStack s; 
  40.     scanf("%d", &N); 
  41.     while(N--) 
  42.     { 
  43.         flag = 1; 
  44.         scanf("%s", str); 
  45.         len = strlen(str); 
  46.         initstack(s); 
  47.         for(i = 0; i < len; ++i) 
  48.         { 
  49.             if(str[i] == '(' || str[i] == '[' || str[i] == '{'
  50.                 pushstack(s, str[i]); 
  51.             else if(str[i] == ')'
  52.             { 
  53.                 if(isemptystack(s) || topstack(s) != '(')   flag = 0; 
  54.                 else    popstack(s); 
  55.             } 
  56.             else if(str[i] == ']'
  57.             { 
  58.                 if(isemptystack(s) || topstack(s) != '[')   flag = 0; 
  59.                 else    popstack(s); 
  60.             } 
  61.             else if(str[i] == '}'
  62.             { 
  63.                 if(isemptystack(s) || topstack(s) != '{')   flag = 0; 
  64.                 else    popstack(s); 
  65.             } 
  66.         } 
  67.         if(!isemptystack(s)) {flag = 0;} 
  68.         if(flag)    printf("Yes\n"); 
  69.         else    printf("No\n"); 
  70.     } 
  71.     return 0; 
  72. }         

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值