【问题描述】
借助一个栈,,每读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到表达式查询完毕。
【算法描述】
① 初始化空栈S
Status InitStack(SqStack &S) { S.base = new char[MAXSIZE]; if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = MAXSIZE; return OK; }
InitStack(S);
② 设置一个标记性变量flag,用来标记匹配结果以控制循环及返回结果,1表示匹配正确,0表示匹配错误,设flag初始值为1。
③ 查找表达式,依次读入字符 ch ,如果表达式没有查找完毕(即ch != '#')且 flag 非零,则循环执行以下操作:
- 若 ch 是左括号 " [ " 或 " ( ",则将其压入栈 —— Push(S, ch);
Status Push(SqStack &S, char e) { if(S.top - S.base == S.stacksize) return ERROR; *S.top++ = e; return OK; }
- 若 ch 是右括号 " ) ",则根据当前栈顶元素的值分情况考虑:1、若栈非空且栈顶元素是" ( ",则匹配正确,取出右括号" ) " —— Pop(S, ch); 2、否则匹配错误,flag置为0,退出while循环。
Status Pop(SqStack &S, char &e) { if(S.top == S.base) return ERROR; e = *--S.top; return OK; }
- 右括号 " ] " 也是如此。
- 退出循环后,如果栈空且flag值为1,则匹配成功,返回true,否则返回false。
整体代码实现:
#include <stdio.h>
#include <cstdlib>
#define MAXSIZE 100
#define OK 1
#define OVERFLOW -2
#define ERROR -1
typedef char SElemType;
//顺序栈的存储结构
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容度
} SqStack;
//初始化栈
int InitStack(SqStack &S)
{
S.base = new char[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
//入栈
int Push(SqStack &S, char e)
{
if(S.top - S.base == S.stacksize) return ERROR;
*S.top++ = e;
return OK;
}
//出栈
int Pop(SqStack &S, char &e)
{
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
//判断栈是否为空
bool StackEmpty(SqStack &S) {
if (S.top == S.base) {
return true;
} else {
return false;
}
}
//取栈顶元素,即返回栈顶元素的值
char GetTop(SqStack &S)
{
if(S.top != S.base)
return *(S.top - 1);
}
bool Matching()
{
char ch, x;
SqStack S;
InitStack(S); //初始化空栈S
int flag;
flag = 1;
scanf("%c", &ch); //读入第一个字符
while(ch != '#' && flag) //当读取的字符为'#'或者flag = 0的时候结束循环
{
switch(ch)
{
case '[':
case '(':
Push(S, ch);
break;
case ')':
if(!StackEmpty(S) && GetTop(S) == '(')
Pop(S, x);
else flag = 0; //匹配错误,出while循环,break
break;
case ']':
if(!StackEmpty(S) && GetTop(S) == '[')
Pop(S, x);
else flag = 0; //匹配错误,出while循环,break
break;
}
scanf("%c", &ch); //继续读入下一个字符
}
if(StackEmpty(S) && flag) return true; //匹配成功
else return false; //匹配错误
}
int main()
{
if(Matching())
{
printf("括号匹配正确\n");
}
else{
printf("括号匹配错误\n");
}
return 0;
}
运行结果如下: