括号匹配 # 数据结构 # 栈

#include<iostream>
#include<cstdlib>
#include<string>
#define INIT_SIZE 100 
#define INCREMENT 10
using namespace std ;
typedef struct{
	 char *base ;
	 char *top ;
	 int stacksize ;
}Sqstack ;
void StackInit(Sqstack &S ){
	 S.base = (char *) malloc (INIT_SIZE * sizeof(char) ) ;
	 if( !S.base ) exit(0) ;  //括号不可省 
	 S.top = S.base  ;
	 S.stacksize = INIT_SIZE ;
}
void Push( Sqstack &S , char e){
 		//先判断栈是否已满
	 if( S.top - S.base >= S.stacksize ){
	  S.base = ( char * ) realloc (S.base , (INIT_SIZE + INCREMENT)* sizeof(char));
	     if( !S.base ) exit(0);
	  S.top = S.base + S.stacksize ; //注意是原来的stacksize ; 
	        S.stacksize += INCREMENT ;
	 }
	 *S.top++ = e ;//先加入元素再自加一 ; 
 }
void Pop(Sqstack &S , char &e ){
	 if( S.base == S.top ) exit(0) ; //判断空栈
	 e = *--S.top ; 
}
char Gettop( Sqstack S , char &e){
	 if( S.base == S.top ) exit(0) ;
	 e = *--S.top ;
	 return e ;
}
bool StackEmpty(Sqstack S){
     return (S.base == S.top) ;
}
bool match(char e1, char e2){//判断配对 
     return ( (e1=='[' &&e2 ==']' ) || (e1 == '(' &&e2 == ')')) ;
}
int matching( Sqstack &S , string str ){
	 int flag = 1, i = 0 ;//flag做是否匹配的标志
	 char x ; 
	 while(i < str.size() && flag ){
	  switch( str[i] ){
	   case '(' :
	   case '[' : {Push(S , str[i]) ;//左括弧放进去;
	              i++ ;
	              break ;}
	   case ')' :
	   case ']' : {if(match(Gettop(S , x) , str[i]) && !StackEmpty(S)){//匹配成功且栈不空
	                  Pop(S , x) ;
	                  i++ ; }
	              else flag = 0 ;
	              break ; }          
	  } 
	 }
	 if( StackEmpty( S ) && flag ) return 1 ;//栈已经空了而且每个都已匹配
	 else return  0 ;
}
int main(){
	 string str ;
	 while( cin >> str ){
	     Sqstack Sa ;
	     StackInit(Sa) ;//初始化空栈
	     if( matching( Sa , str ) )  cout<<"yes"<<endl;
	     else cout<<"no"<<endl;
	  }
	    system("pause") ;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值