字符串中左右括号匹配判断

一、要求:

判断一个字符串中的小括号是否匹配。例如,字符串“((())())”中的小括号匹配,而“)()”中的小括号不匹配。如果匹配则提示匹配,如果不匹配则提示第一个不匹配的括号的位置。

 

二、 效果:

clip_image002

 

三、思路:

得到字符串,从头开始,一个一个字符判断。

(1) 如果是左括号则压入栈中。

(2) 如果是右括号,则将一个左括号从栈中弹出,匹配一对。若此时栈中无元素,那么这个右括号没有匹配的左括号。

最后,如果栈不为空,则有左括号没有匹配。

 

四、核心代码:

for(i = 0; i < brackets.length(); i++) {
        
if(brackets[i] == '(') {
        
//1.left bracket
            bracketStack.push('(');
            
if(bracketStack.size() == 1) {
                bottom 
= i;
            }
        }
else if (brackets[i] == ')') {
        
//2.right bracket
            if(!bracketStack.empty()) {
                tmp 
= bracketStack.top();
                bracketStack.pop();
            } 
else {
                res 
= nMatch;
                
//move to wrong position
                i++;
                
break;
            }
        }
        
//ingore non bracket
    }

 

 

五、所有代码

:

 

ExpandedBlockStart.gif 代码
// BracketMatch.cpp
// judge a string whether is brackets match['(' and ')'] string,
// while not match,return first position
// powered by alan
// 2010.10.14

#include 
< iostream >
#include 
< string >
#include 
< stack >

using   namespace  std;

int  main() {
    
// define data
     string  brackets  =   "" ;
    stack
< char >  bracketStack;
    
char  tmp;
    
enum  Res{matched,nMatch}res;
    res 
=  matched;
    
int  bottom  =   0 ;
    
    
// get input
    cout << " 输入需要匹配的括号串 " << endl;
    cin
>> brackets;
    
    
// judge
     int  i;
    
for (i  =   0 ; i  <  brackets.length(); i ++ ) {
        
if (brackets[i]  ==   ' ( ' ) {
        
// 1.left bracket
            bracketStack.push( ' ( ' );
            
if (bracketStack.size()  ==   1 ) {
                bottom 
=  i;
            }
        }
else   if  (brackets[i]  ==   ' ) ' ) {
        
// 2.right bracket
             if ( ! bracketStack.empty()) {
                tmp 
=  bracketStack.top();
                bracketStack.pop();
            } 
else  {
                res 
=  nMatch;
                
// move to wrong position
                i ++ ;
                
break ;
            }
        }
        
// ingore non bracket
    }
    
    
// have '(' not match
     if ( ! bracketStack.empty()){
        res 
=  nMatch;
        
// get the first not match
        i  =  bottom  +   1 ;
    }
    
    
switch (res) {
    
case  matched:
        cout
<< " 括号字符串匹配! " << endl;
        
break ;
    
case  nMatch:
        cout
<< " " << i << " 个括号字符串不匹配! " << endl;
        
break ;
    }
    
    
return   0 ;
}











 

 

转载于:https://www.cnblogs.com/icescut/archive/2010/10/14/BracketMatch.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值