#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") ;
}
括号匹配 # 数据结构 # 栈
最新推荐文章于 2022-03-26 19:52:55 发布