在前面的栈上实现括号匹配问题。
#include "linkStack.h"
static int dio = 0;/*解决‘’的匹配*/
static int shuang = 0;/*解决“”的匹配*/
bool isLeft( const char left ) {
bool flag = false;
switch (left) {
case '<':
case '{':
case '[':
case '(':
flag = true;
break;
case '\'':
++dio;
flag = true;
break;
case '\"':
++shuang;
flag = true;
break;
default:
flag = false;
break;
}
return flag;
}
bool isRight(const char right) {
bool flag = false;
switch ( right ) {
case '>':
case '}':
case ']':
case ')':
flag = true ;
break;
case '\'':
++dio;
flag = true;
break;
case '\"':
++shuang;
flag = true;
break;
default :
flag = false;
break;
}
return flag;
}
bool match( const char left , const char right ) {
bool flag = false;
switch ( left ) {
case '<':
flag = (right=='>');
break;
case '[':
flag = (right==']');
break;
case '(':
flag = (right==')');
break;
case '{':
flag = (right=='}');
break;
case '\'':
flag = (right=='\'');
break;
case '\"':
flag = (right=='\"');
break;
default :
flag = false;
break;
}
return flag;
}
int scanner( const char *code ) {
linkStack chen;
LinkStack *stack = chen.LinkStack_Create();
int ret = 0 ;
char *pos = const_cast<char*>(code);
while ( *pos!='\0' ) {
if( isLeft(*pos) ){
chen.LinkStack_Push(stack,pos);
}
if ( isRight(*pos) ) {
char *left = (char*)chen.LinkStack_Pop(stack);
if ( !match(*left,*pos) ) {
break;
}
}
++pos;
}
if ( (chen.LinkStack_Size(stack)==0 )&&(*pos=='\0')&&( dio%4==0)&&(shuang%4==0) ) {
cout << "succeed!" << endl;
ret = 1;
}else {
cout << "fail!" << endl;
ret = 0;
}
chen.LinkStack_Destroy(stack);
return ret;
}
int main(int argc, char **argv) {
const char* code = "#include <stdio.h> int main() { int a[5][5]; int (*p)[4]; p = a[0]; printf(\"%d\\n\", &p[3][3] - &a[3][3]); return 0; }";
scanner(code);
system( "pause" );
return 0;
}