栈应用之括号匹配

来源:互联网 发布:js如何让下拉菜单 编辑:程序博客网 时间:2024/04/27 22:32

此代码仅为栈的简单应用,对括号匹配问题做出了描述,栈的更多用途表达式求值将在后面推出

#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW -1#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#include "stdio.h"#include "malloc.h"#include "stdlib.h"#include "string.h"typedef int status;typedef char SelemType;typedef struct{SelemType *base;SelemType *top;int stacksize;}SqStack;status InitStack(SqStack &S){S.base = (SelemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType));if(!S.base) exit (OVERFLOW);S.top=S.base;S.stacksize = STACK_INIT_SIZE;return OK;}status Push(SqStack &S, SelemType e){if(S.top - S.base >= S.stacksize){S.base = (SelemType *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SelemType));if(!S.base)exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++=e;return OK;}status Pop(SqStack &S, SelemType &e){if(S.top == S.base)return ERROR;e=*--S.top;//栈顶指针在元素后一个return OK;}status StackEmpty(SqStack S){if(S.top==S.base)return TRUE;else return FALSE;}int correct(char *exp, int max){int i, flag;char e, x;SqStack S;InitStack(S);for(i=0;i<strlen(exp); i++){x = exp[i];if(exp[i] =='('|| exp[i]=='['||exp[i] == '{')Push(S,x); if(x ==')'|| x==']'||x == '}'){if(!Pop(S,e))flag=0;else if((x ==')'&&e!='(') || (x == ']' && e != '[')|| (x == '}' && e != '{'))flag = 0;}}if(S.top!=S.base)flag = 0;return flag;}void main(){char exp[100];while(1){printf("请输入表达式,输出0退出:");gets(exp);if(strcmp(exp, "0") == 0)break;if(correct(exp, strlen(exp)) == 0)printf("内容表达式为:\n%s\n表达式括号不匹配\n", exp);elseprintf("表达式括号匹配!\n");}}
原创粉丝点击