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

栈是一种很重要的数据结构,用栈我们可以做很多事情,下面简单介绍一种用栈来判断用户输入的括号{}()[]是否匹配的算法。
算法简介:
     用户输入的括号只有成对出现且符合一般的书写规范才算合法,比如[{( )}], {( )( )}[ ]都算合法,[( ]), []( }的不算合法。因此我们可以依次读入用户输入的字符串,把出现的'(' '{' '['压入栈中,读到')' '}' 或']'时栈顶元素出栈和它比较,并移动栈顶位置-1,如果匹配则继续,不匹配返回0,如果都匹配,栈最后应该是空的。
     因为栈底不会移动,我们构造一个顺序栈,包含栈顶指针,栈底指针和栈的最大空间(判断栈是否满)可以满足我们的要求。
C语言代码:
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define MAX_SIZE 100

typedef 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值