1. 程式人生 > >用棧判斷輸入的括號是否匹配

用棧判斷輸入的括號是否匹配

棧是一種很重要的資料結構,用棧我們可以做很多事情,下面簡單介紹一種用棧來判斷使用者輸入的括號{}()[]是否匹配的演算法。 演算法簡介:      使用者輸入的括號只有成對出現且符合一般的書寫規範才算合法,比如[{( )}], {( )( )}[ ]都算合法,[( ]), []( }的不算合法。因此我們可以依次讀入使用者輸入的字串,把出現的'(' '{' '['壓入棧中,讀到')' '}' 或']'時棧頂元素出棧和它比較,並移動棧頂位置-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;
}