您的位置:首页 > 理论基础 > 数据结构算法

数据结构-栈的实现之括号匹配检测

2016-04-17 14:42 253 查看
假设表达式中只允许两种括号:()、{};
正确表达顺序为:()或{}或({})或{({}{})}的形势;如{(}或(})或({)}的表达形势均不对。
算法的设计思想:

  出现左括弧则进栈;

  出现右括弧则首先检测栈是否为空,

    若栈空则表明此右括弧多余,表达式不匹配。

    否则和栈顶数据比较,若匹配则栈顶出栈。

      否则表明表达式不匹配;

  最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配。

实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作)

void Matching(char e[])
{
Stack S;
InitStack(S);
unsigned int i = 0, state = 1;
char z;
while((int)(i <= strlen(e)) && state && e[i] != '\0')    //结束条件 超出数组长度或state为0或字符串结束
{
switch(e[i])
{
case '(':
case '{':
Push(S,e[i]);    //遇到({则进栈
i++;
break;
case ')':
GetTop(S,z);
if(!StackEmpty(S) && z == '(')    //遇到)则判断栈顶是不是(,是的话出栈,不是则不匹配
{
Pop(S,z);
i++;
}
else
state = 0;
break;
case '}':
GetTop(S,z);
if(!StackEmpty(S) && z == '{')//遇到}则判断栈顶是不是{,是则出栈,不是则不匹配
{
Pop(S,z);
i++;
}
else
state = 0;
break;
}
}
if(StackEmpty(S) && state)    //空栈且state不为0则全部匹配
printf("括号全部匹配");
else
printf("括号不匹配");
}


主函数测试代码如下:

void main()
{
char e[20];
printf("请输入括号:");
scanf("%s",e);
Matching(e);
}


测试只要输入表达式格式正确,则匹配结果是正确的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: