所谓括号校验匹配其实质是对多种类型括号正确配对的校验(包括:()、[]、{})即([])或者[()]为正确的表达式,如果出现交叉则匹配失败,如[(])或([())则为不正确格式。
该程序也运用了栈的思想。若是左括号则入栈,若是右括号则看是否和当前栈顶元素是否匹配。若是则出栈,不是则当前表达式括号不匹配。
程序思想:
1.初始设置一个空栈,顺序读入括号。
2.若是右括号,则使置于栈顶的元素出栈与之匹配,若是括号序列不匹配,则退出程序
3.若是左括号,则将元素压入栈中,算法结束时,栈为空,否则括号序列不匹配
以下为示例代码:
//栈应用之校验括号的匹配
#include "stdafx.h"
#include "string.h"
#define ElementType char
#define MaxSize 10
//定义结构体
typedef struct {
ElementType data[MaxSize];//数据域
int top;//栈顶指针
int size;//栈当前容量
}SqStack;
/*
初始化栈
*/
void InitStack(SqStack &s) {
s.top = -1;
s.size = 0;
}
/*
判断栈是否为空
*/
bool StackEmpty(SqStack s) {
if (s.size == 0) {
return true;
}
return false;
}
/*
入栈
*/
bool PushStack(SqStack &s,ElementType e) {
//if(s.top==MaxSize-1)
if (s.size == MaxSize) {
//栈满
return false;
}
s.top++;
s.data[s.top] == e;
s.size++;
return true;
}
/*
出栈
*/
ElementType PopStack(SqStack &s) {
//if(s.top==-1)
if (s.size==0) {
//栈空
return NULL;
}
ElementType e = s.data[s.top];
s.top--;
s.size--;
return e;
}
/*
校验括号是否匹配
*/
bool CheckMatch(char *str) {
SqStack stack;
InitStack(stack);
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char x = str[i];
ElementType e;
switch (x) {
case '(':
PushStack(stack, x);
break;
case '[':
PushStack(stack, x);
break;
case '{':
PushStack(stack, x);
break;
case ')':
e = PopStack(stack);
if (e != '(') {
return false;
}
break;
case ']':
e = PopStack(stack);
if (e != '[') {
return false;
}
break;
case '}':
e = PopStack(stack);
if (e != '{') {
return false;
}
break;
}
}
bool b = StackEmpty(stack);
if (b) {
return true;
}
return false;
}
void main() {
char str[] = "[({})]";
bool b = CheckMatch(str);
if (b) {
printf_s("匹配成功");
}
else
{
printf_s("匹配失败");
}
}