数据结构(C语言)读书笔记6:栈的应用之括号匹配的C代码实现

来源:互联网 发布:淘宝卖童装怎么样 编辑:程序博客网 时间:2024/05/01 14:22

括号匹配的算法思想:

初始化一个空栈,扫描表达式,依次读入字符,知道扫描完或者出现错误匹配。对于读入的每个字符,分以下情况处理:

(1)、如果是‘’(“”或“【”,将其压入栈。

(2)、如果是“)”,则根据当前栈顶元素的值分情况考虑。若栈顶元素是“(”,则匹配成功,否则为非法情况。

(3)、如果是“】”,则根据当前栈顶元素的值分情况考虑。若栈顶元素是“【”,则匹配成功,否则为非法情况。


——————————C代码——————VC++6.0编译成功,成功运行—————————————————

#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int Status;typedef char SElemType;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1#define STACK_INNT_SIZE 100//存储空间初始分配量  #define STACKINCREMENT 10//存储空间分配增量typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;Status InitStack(SqStack &S){S.base= (SElemType *) malloc(STACK_INNT_SIZE * sizeof(SElemType) ) ; if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INNT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);S.base=S.top=NULL;return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.top==S.base)return TRUE;return FALSE;}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==NULL){printf("malloc failed.\n");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 GetTop(SqStack S,SElemType &e){if(S.top==S.base)return ERROR;e=*(S.top-1);return OK;}void Matching(){   SqStack S;   SElemType ch[80],*p,e;   InitStack(S);   printf("请输入表达式:\n");   gets(ch);   p=ch;   while(*p)   {   switch(*p){   case '(':   case '[':   Push(S,*p++);   break;   case  ')':    case ']':   if(!StackEmpty(S))   {   Pop(S,e);   if(*p==')'&& e!='('||*p=='['&& e!=']')   {   printf("左右括号不配对\n");   return;   }   else   {   p++;   break;   }   }   else   {   printf("缺少左括号\n");   return;   }   default:p++;   }      }   if(StackEmpty(S))   printf("括号匹配.\n");   else   printf("缺少右括号.\n");}int main(){Matching();    system("pause");return 0;}