之前的那个:https://blog.csdn.net/weixin_42072280/article/details/87975849
/*
([[])
]]()
[]([])
*/
/*
要求:
只考虑小括号和中括号
算法设计:
通过结构体定义一个栈SeqStack和一个char类型的数组,用来存储字符串
输入一行字符串,逐一判断其中的括号
如果是左括号,则直接进栈。如果是有括号“)”或“]”,则检查栈顶元素是否为相应的左括号,
如果是则出栈,如果不是,则说明括号不匹配。如果一直带处理完所有的字符都没有发现不匹配
的括号,则说明匹配成功。
*/
#include<stdio.h>
#include<malloc.h>
typedef unsigned char boolean;
#define TRUE 1
#define FALSE 0
typedef char dataType;
#define MAXSIZE 100
typedef struct{
dataType *data;
int maxSize;
int top;
}SeqStack;
boolean initStack(SeqStack **s);
void destroyStack(SeqStack **s);
boolean push(SeqStack *s, dataType x);
boolean isStackFull(SeqStack s);
boolean isStackEmpty(SeqStack *stack);
boolean getTop(SeqStack *stack, dataType *x);
boolean pop(SeqStack *stack, dataType *x);
boolean isBrackerMatched(SeqStack *s, char *str, int *index);
void showWrongMatch(char *str, int misMatchIndex);
void showWrongMatch(char *str, int misMatchIndex){
int i;
printf("原字符串为:%s\n", str);
printf("错误位置在:");
for(i = 0; i < misMatchIndex; i++){
printf(" ");
}
printf("^\n");
}
boolean isBrackerMatched(SeqStack *s, char *str, int *index){
int i;
dataType tmp;
for(i = 0; str[i]; i++){
if(str[i] == '(' || str[i] == '['){
push(s, str[i]);
}else if(str[i] == ')'){
printf("$$$\n");
getTop(s, &tmp);
if(isStackEmpty(s) || tmp != '('){
*index = i;
printf("括号不匹配!\n");
showWrongMatch(str, *index);
return FALSE;
}else{
pop(s, &tmp);
}
}else if(str[i] == ']'){
getTop(s, &tmp);
printf("tmp=%c(%d)\n", tmp, tmp);
if(isStackEmpty(s) || tmp != '['){
printf("&&&\n");
*index = i;
printf("括号不匹配!\n");
showWrongMatch(str, *index);
return FALSE;
}else{
pop(s, &tmp);
}
}
printf("**\n");
}
printf("括号匹配!\n");
return TRUE;
}
boolean pop(SeqStack *stack, dataType *x){
if(isStackEmpty(stack)){
return FALSE; //栈空,如法出栈
}
*x = stack->data[stack->top--];
return TRUE;
}
boolean getTop(SeqStack *stack, dataType *x){
if(isStackEmpty(stack)){
return FALSE; //栈空
}
*x = stack->data[stack->top];
return TRUE;
}
boolean isStackEmpty(SeqStack *stack){
return stack->top == -1;
}
boolean isStackFull(SeqStack s){
return s.top == s.maxSize-1;
}
boolean push(SeqStack *s, dataType x){
if(isStackFull(*s)){
return FALSE;
}
s->data[++s->top] = x;
return TRUE;
}
void destroyStack(SeqStack **s){
free((*s)->data);
free(*s);
*s = NULL; //s = NULL;
}
boolean initStack(SeqStack **s){
if(*s != NULL){
return FALSE;
}
*s = (SeqStack *)malloc(sizeof(SeqStack));
(*s)->data = (dataType *)malloc(sizeof(dataType) * MAXSIZE);
(*s)->maxSize = MAXSIZE;
(*s)->top = -1;
return FALSE;
}
void main(void){
char str[100];
SeqStack *s = NULL;
int index;
initStack(&s);
printf("请输入括号:");
gets(str);
isBrackerMatched(s, str, &index);
destroyStack(&s);
}