使用栈的结构检验一串输入的括号和中括号是否匹配,只有()和[]一一对应的时候,该串才算正确的串,如:([]())和[([][])]是正确的串,[(])和([())是不正确的。
首先读取输入的串,检查每个当前元素,如果是(或者[则压入栈中,是)或]则检查栈顶元素,如果栈顶元素与当前元素刚好闭合,则将栈顶元素弹出。换而言之,栈中存储的内容只有(和[,当栈为空,当前元素为)或]即可判断出当前串不正确。栈为空时串即为正确的串。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Stack_Init_Size 100
#define Stack_Increment 10
//栈的定义
typedef struct {
char* base=NULL;
char* top;
int stacksize;
}SqStack;
//初始化栈
int Init(SqStack &stack){
if(!stack.base){
stack.base=(char*)malloc(Stack_Init_Size*sizeof(char));
stack.top=stack.base;
stack.stacksize = Stack_Init_Size;
printf("初始化成功\n");
return 0; //初始化成功
}
else return -1;//表示无法初始化已出始化栈
}
//获取栈顶数据
char GetTop(SqStack stack){
if(stack.base==stack.top){
printf("栈中没有数据\n");
return '#';
}
printf("获取栈顶数据成功\n");
return *(stack.top-1);
}
//往栈中插入元素
int Push(SqStack &stack,char element){
if(stack.top-stack.base==stack.stacksize){
stack.base=(char*)realloc(stack.base,Stack_Increment*sizeof(char));
stack.top=stack.base+stack.stacksize;
stack.stacksize+=Stack_Increment;
}
*stack.top=element;
stack.top+=1;
printf("插入数据成功\n");
return 0;//表示成功
}
//删除栈顶元素
char Pop(SqStack &stack){
if(stack.top==stack.base){
printf("栈为空\n");
return '#';
}
printf("删除数据成功");
return *--stack.top;
}
//释放栈空间
int Destroy(SqStack &stack){
free(stack.base);
stack.stacksize=0;
printf("销毁栈成功\n");
return 0;
}
//处理数据,借助栈判断
int ExecuteData(SqStack &stack,char* data){
Push(stack,data[0]);
for(int i=1;i<strlen(data);i++){
char top = GetTop(stack);
switch(top){
case '(':
if(data[i]==')')Pop(stack);
else Push(stack,data[i]);
break;
case '[':
if(data[i]==']')Pop(stack);
else Push(stack,data[i]);
break;
case '#':
if(data[i]=='('||data[i]=='['){
Push(stack,data[i]);
break;
}
else
default:return -1;break;
}
}
if(stack.top==stack.base){
Destroy(stack);
return 0;
}
else{
Destroy(stack);
return -1;
}
}
int main(){
SqStack stack;
Init(stack);
char data[180];
scanf("%s",data);
int result = ExecuteData(stack,data);
if(result==0)printf("括号是正确匹配的\n");
else printf("括号匹配不正确\n");
return 0;
}