括号匹配检测程序
需求分析
- 输入的形式和输入值的范围;
输入一个算术表达式 - 输出的形式;
打印括号是否匹配的检测结果 - 程序所能实现的功能;
以字符序列的形式从终端输入一串字符,检测其中括号是否匹配,并输出检测结果:“匹配”“不匹配”。 - 测试数据
(1)输入表达式 3*(7-2)
(2)输入表达式 (2a+2))(6b/2)
(3)输入表达式 (20(63+2*(3+6))
(4)输入表达式 [(6+6)6+3][2+6)2
(5)输入表达式 20(63+2*(3+6)]
(6)输入表达式 [(6+6)6+3][(2+6)*2]
流程设计
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define YES 1
#define NO 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef char ElemType;
typedef struct{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S){
(*S).base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!(*S).base)
exit(OVERFLOW);
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S, ElemType e){
if((*S).top-(*S).base>=(*S).stacksize){
(*S).base = (ElemType *)realloc((*S).base, ((*S).stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!(*S).base)
exit(OVERFLOW);
(*S).top = (*S).base + (*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*(S->top) = e;
(S->top)++;
return OK;
}
Status Pop(SqStack *S, ElemType *e){
if((*S).top==(*S).base)
return ERROR;
(*S).top--;
*e = *((*S).top);
return OK;
}
Status StackEmpty(SqStack S){
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
int Solve(SqStack *S, char *str){
char tmp;
int len = strlen(str);
printf("%d\n", len);
for(int i = 0; i < len; i++){
if(str[i]=='('||str[i]=='[')
Push(S, str[i]);
else if(str[i]==')'){
if(StackEmpty(*S)) return 0;
Pop(S, &tmp);
if(tmp!='(') return 0;
}
else if(str[i]==']'){
if(StackEmpty(*S)) return 0;
Pop(S, &tmp);
if(tmp!='[') return 0;
}
}
if(!StackEmpty(*S)) return 0;
return 1;
}
int main(){
SqStack st;
char tmp[200], a[100];
printf("请输入表达式:");
gets(tmp);
int lent = strlen(tmp);
int cnt = 0,i;
for(i = 0; i < lent; i++)
if(tmp[i]=='('||tmp[i]==')'||tmp[i]=='['||tmp[i]==']')
a[cnt++] = tmp[i];
a[cnt] = '\0';
InitStack(&st);
if(Solve(&st, a)) printf("匹配!\n");
else printf("不匹配!\n");
return 0;
}