栈是一种很重要的数据结构,用栈我们可以做很多事情,下面简单介绍一种用栈来判断用户输入的括号{}()[]是否匹配的算法。
算法简介:
用户输入的括号只有成对出现且符合一般的书写规范才算合法,比如[{( )}], {( )( )}[ ]都算合法,[( ]), []( }的不算合法。因此我们可以依次读入用户输入的字符串,把出现的'(' '{' '['压入栈中,读到')' '}' 或']'时栈顶元素出栈和它比较,并移动栈顶位置-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;
}