检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号,每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到表达式扫描完毕
在处理的过程中,还要考虑括号不匹配的情况。
【算法步骤】
1.初始化一个空栈S
2.设置一标记性变量flag,用来标记匹配结果以控制循环及返回结果,1表示正确匹配,0表示错误匹配,flag初值为1
3.扫描表达式,依次读入字符ch,如果表达式没有扫描完毕或flag非0,则循环执行下面操作:
(1)若ch是左括号’(‘或’[’,则将其入栈
(2)若ch是“)”,则根据当前栈顶元素的情况来分,若栈顶元素为’(’,则匹配成功,若否则匹配失败,flag置为0
(3)若ch是“]”,则根据当前栈顶元素的情况来分,若栈顶元素为’[’,则匹配成功,若否则匹配失败,flag置为0
4.退出循环后,如果栈空且flag=1,则匹配成功,返回true,否则,返回false
Status Matching()
{
//检验表达式中所含括号是否正确匹配,如果匹配则返回true,否则,返回false
//表达式以‘#’作为结束
InitStack(S); //初始化空栈
flag=1; //标记匹配结果以控制循环和返回结果
cin>>ch; //读入第一个字符;
while(ch!='#'&&flag)
{
switch(ch)
{
case '('||'[': //若是左括号,则将其入栈
push(S,ch);
break;
case ')':
if(GeTop(S)=='('&&!StackEmpty(S))
pop(S,x);
else
flag=0;
break;
case ']':
if(GetTop(S)=='['&&!StackEmpty(S))
pop(S,x);
else
flag=0;
break;
}
cin>>ch; //继续读入下一个字符
}
if(flag==1&&StackEmpty(S)) //匹配成功
return true;
else //匹配失败
return false;
}
#include<iostream>
using namespace std;
typedef struct Node
{
char data;
struct Node *next;
};
typedef struct Stack
{
struct Node *top; //栈顶指针
int size; //栈的大小
};
bool InitStack(Stack *&s)