用栈来实现 括号匹配 字符序列检验

​ 为了方便描述,对于需要做匹配的两个符号,比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号为标准,左侧符号需要右侧符号来完成匹配,但是由于诸如括号这类的符号可以做嵌套,所以左侧符号之后既能有左侧符号,也能有右侧符号,处理起来很麻烦。以右侧符号为标准就没有这个问题了,每一个右侧符号都需要一个左侧符号来匹配,并且要求该右侧符号之前最近的一个符号必须是相匹配的左侧符号,这样处理起来就方便多了。

​ 利用栈可以很容易地解决这个问题,在遍历字符串时,若当前位置是右侧符号,那它需要一个该位置之前最近的一个符号为左侧符号,否则不匹配。定义一个栈,用以记录遍历到当前位置时,所遇到的左侧符号,处理方式是这样的,每当遇到一个右侧符号时,检查栈是否为空,若此时栈不为空,则对栈进行pop操作表明顶部元素已被匹配,否则为不匹配情况,直接返回false。当整个字符串遍历结束,我们就可以通过判断该栈是否为空来判断整个字符串中的符号是否匹配。具体代码如下

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
typedef int Status;
typedef char SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(sizeof(SElemType)*MAXSIZE);
if(!S.base){
printf("储存空间分配失败");
exit(-2);
}

S.top=S.base;
S.stacksize=MAXSIZE;
return 1;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
return 0;
*S.top++=e;
return 1;
}

Status ClearStack(SqStack &S)
{
S.top = S.base;
return 1;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base){
printf("栈空");
return 0;
}

e=*--S.top;
return 1;
}
SElemType GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base){
printf("栈空!");

}else{
e=*(S.top-1);
return 1;
}
}

int Judge(SElemType e)
{
if(e=='['||e==']'||e=='('||e==')')
return 1;
else
return 0;
}

int JudgeSe(char a,char b){
if((a=='('&&b==')')||(a=='['&&b==']'))
return 1;
return 0;
}

int Put(){
SqStack OPND,OPTR;
SElemType e;
char ch;
InitStack(OPND);
printf("请输入需要检验的括号顺序:") ;

ch=getchar();

if(Judge(ch)==0){

printf("输入格式错误!");

}


while(Judge(ch)){
printf("ceshi");
printf(" ");
if(ch=='('||ch=='['){
Push(OPND,ch);
ch=getchar();

}else{
GetTop(OPND,e);
if(!JudgeSe(e,ch)){
printf("%c",e);
printf("括号不合法!");
exit(0);
}
Pop(OPND,e);
ch=getchar();
}

}
printf("括号合法!") ;

return 0;
}

int main(){
Put();



}



原文地址:https://www.cnblogs.com/xufeng123/p/7868586.html