用栈判断输入的括号是否匹配

来源:互联网 发布:petapoco sql 编辑:程序博客网 时间:2024/06/05 10:04
栈是一种很重要的数据结构,用栈我们可以做很多事情,下面简单介绍一种用栈来判断用户输入的括号{}()[]是否匹配的算法。
算法简介:
     用户输入的括号只有成对出现且符合一般的书写规范才算合法,比如[{( )}], {( )( )}[ ]都算合法,[( ]), []( }的不算合法。因此我们可以依次读入用户输入的字符串,把出现的'(' '{' '['压入栈中,读到')' '}' 或']'时栈顶元素出栈和它比较,并移动栈顶位置-1,如果匹配则继续,不匹配返回0,如果都匹配,栈最后应该是空的。
     因为栈底不会移动,我们构造一个顺序栈,包含栈顶指针,栈底指针和栈的最大空间(判断栈是否满)可以满足我们的要求。
C语言代码:
#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define MAX_SIZE 100typedef int status;typedef char Eletype;typedef struct stack{     Eletype *top;     Eletype *base;     int stacksize;}stack, *pstack;void initStack(pstack);status pop(pstack);status push(pstack, Eletype);status isEmpty(pstack);status isFull(pstack);status march(pstack, Eletype*);Eletype getTop(pstack);int main(void){     stack st;     pstack sp;     char str[100];     sp = &st;     gets(str);         initStack(sp);         if ( !march(sp, str) )          printf("此表达式括号不匹配!\n");     else          printf("表达式合法!\n");     return 0;}void initStack(pstack sp){     sp->base = (Eletype*)malloc( sizeof(Eletype)*MAX_SIZE );     if (!sp->base)          exit(-1);     sp->top = sp->base;     sp->stacksize = MAX_SIZE;}status pop(pstack sp){     if ( isEmpty(sp) )          return ERROR;    sp->top--;     return OK;}Eletype getTop(pstack sp){     return *(sp->top-1);}status push(pstack sp, Eletype m){     if ( isFull(sp) )          return ERROR;     *sp->top = m;     sp->top++;     return OK;}status isEmpty(pstack sp){     if (sp->base == sp->top)          return OK;     return ERROR;}status isFull(pstack sp){     return sp->top-sp->base+1 == MAX_SIZE;}status march(pstack ps, Eletype* str){     int i = 0;     int flag = 0;     char comp;     for (i; str[i]!='\0'; i++)     {          switch (str[i]){          case '[':     push(ps, str[i]); break;          case '(':     push(ps, str[i]); break;          case '{':     push(ps, str[i]); break;          case '}':     comp = getTop(ps); pop(ps); if(comp != '{') flag=1; break;          case ')':     comp = getTop(ps); pop(ps); if(comp != '(') flag=1; break;          case ']':     comp = getTop(ps);  pop(ps); if(comp != '[') flag=1; break;          default: break;          }          if (flag == 1)               return 0;     }     if (isEmpty(ps))          return 1;     return 0;}


1 0