利用栈来解决括号配对问题,左括号配右括号, 如: ( ) 配对正确 ( ] 配对错误 ( [ ] ) 配对正确 ( [ ) ) 配对错误
代码简单,注释可以看懂
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
char *base;
char *top;
int stacksize;
} SqStack;
int main()
{
//各函数集的声明
bool Push(SqStack &s , char e);
bool Pop(SqStack &s , char &e);
bool GetTop(SqStack s , char &e);
bool InitStack(SqStack &s);
bool panDuan(char kuoHao[] , SqStack &s);
char kuoHao[8]={'[' , '(' , '[' , '(' ,'[' , ']' , ')' , '('};
SqStack s;
InitStack(s);
if( panDuan(kuoHao , s)) printf("括号配对正确");
else printf("括号配对错误");
}
bool Push(SqStack &s , char e)
{
if(s.top - s.base >= s.stacksize ) //栈满
{
s.base = (char*)realloc(s.base , (s.stacksize+STACKINCREMENT ) *sizeof(char) ) ;
if(!s.base) return false;
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
*s.top++ = e;
return true;
}
bool Pop(SqStack &s , char &e) //出栈
{
if(s.top == s.base) return false;
e = * --s.top;
return true;
}
bool GetTop(SqStack s , char &e) //取栈顶元素
{
if(s.top == s.base ) return false;
e = *(s.top-1);
return true;
}
bool InitStack(SqStack &s)
{
s.base = (char*)malloc(STACK_INIT_SIZE * sizeof(char));
if(!s.base) return false;
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return true;
}
bool panDuan(char kuoHao[] , SqStack &s)
{
char stack_top_value;
char u ;//临时存放Pop出来的栈顶值
for(int i=0 ; i<8 ; i++)
{
char m = kuoHao[i];
if(m == '(' || m == '[')
{
Push(s , m);
}
if(m == ')')
{
GetTop(s , stack_top_value);
if(stack_top_value == '(')
Pop(s , u );
}
else
{
if(m == ']')
{
GetTop(s , stack_top_value);
if(stack_top_value == '[')
Pop(s , u );
}
else
{
return false; //括号配对错误
}
}
}
return true; // 括号配对正确
}
运行结果: