链栈实现括号匹配检验
问题描述
假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])]等为正确格式,[( ])或(((]均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:
[ | ( | [ | ] | [ | ] | ) | ] |
---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号的出现,然而等来的却是第2个括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的 第7个括号“)”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了。
方法描述
输入括号,
若输入为左括号“(”或“[”,则将其入栈
若输入为右括号“)”,则进行判断:
若栈顶元素为“(”,正确匹配,出栈
否则错误匹配
若输入为右括号“]”,则进行判断:
若栈顶元素为“[”,正确匹配,出栈
否则错误匹配
链栈部分
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int SElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S){
S=NULL;
return OK;
}
Status Push(LinkStack &S,SElemType e){
LinkStack p=(LinkStack)malloc(sizeof(StackNode));
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S,SElemType &e){
if(S==NULL){
return ERROR;
}
e=S->data;
LinkStack q=S;
S=S->next;
free(q);
return OK;
}
SElemType GetTop(LinkStack S){
if(S!=NULL){
return S->data;
}
}
括号匹配检验部分
Status Matching(LinkStack &