#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LIST_INIT_SIZE 100
#define ADD_SIZE 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int statue;
typedef char ElemType;
typedef struct{
ElemType *sTop;
ElemType *sBottom;
int list_size;
}STACK;
statue CreateStack(STACK *stack){
stack->sBottom=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!stack->sBottom){
printf("内存分配失败\n");
exit(OVERFLOW);
}
stack->list_size=LIST_INIT_SIZE;
stack->sTop=stack->sBottom;
return OK;
}
statue isEmpty(STACK stack){//判断是否为空
if(stack.sTop==stack.sBottom){
return OK;
}
return ERROR;
}
statue isFull(STACK stack){//判断是否满了
if(stack.sTop-stack.sBottom==stack.list_size){
return OK;
}
return ERROR;
}
statue Push(STACK *stack,char val){//压栈
if(isFull(*stack)){
stack->sBottom=(ElemType *)realloc(stack->sBottom,stack->list_size+sizeof(ElemType)*ADD_SIZE);
stack->sTop=stack->sBottom+stack->list_size;
if(!stack->sBottom){
printf("内存分配失败\n");
exit(OVERFLOW);
}
}
*stack->sTop=val;
stack->sTop++;
return OK;
}
void showStack(STACK stack){//显示栈所有元素
ElemType *p=stack.sTop-1;
while(p!=stack.sBottom-1){
printf("%c\n",*p);
p--;
}
}
statue popStack(STACK *stack){//出栈
if(isEmpty(*stack)){
return ERROR;
}
stack->sTop--;
return OK;
}
statue clearStack(STACK *stack){//清空
stack->sBottom=stack->sTop;
stack->list_size=0;
return OK;
}
void judge(char *val){
STACK stack;
CreateStack(&stack);
while(*val){
if(*val=='('||*val=='['||*val=='{'||*val=='<'){
Push(&stack,*val);
val++;
}else{
if(isEmpty(stack)){
printf("不合法\n");
exit(OVERFLOW);
}
if(*val==')'&&*(stack.sTop-1)=='('||*val=='>'&&*(stack.sTop-1)=='<'||*val=='}'&&*(stack.sTop-1)=='{'||*val==']'&&*(stack.sTop-1)=='['){
//出栈
popStack(&stack);
val++;
}else{
printf("不合法\n");
exit(OVERFLOW);
}
}
}
if(isEmpty(stack)){
printf("合法\n");
exit(OVERFLOW);
}else{
printf("不合法\n");
exit(OVERFLOW);
}
}
int main(){
printf("输入括号...\n");
char str[100],*p;
p=str;
gets(str);
judge(p);
return 0;
}
括号检测
最新推荐文章于 2024-05-24 18:02:02 发布