您的位置:首页 > 其它

用链栈实现字符串表达式括号匹配算法

2017-07-29 19:27 417 查看
字符串表达式括号匹配算法思路

1、遍历字符串中的字符,遇到左括号字符先压入栈,遇到右括号,栈顶字符出栈与之进行比较,如果配对则继续循环遍历下一字符,否则就返回不匹配。例如:(6*3]

2、遍历过程中,若栈为空,但当前字符是右括号时,则返回匹配失败。例如:(7-1))

3、遍历完字符串后,若发现栈不为空,则返回不匹配。例如:(5/2

4、从第二个字符遍历开始,如果当前字符是数字,则前一个字符如果是右括号,则返回不匹配。例如:(6+)5

5、如字符串中没有括号时,返回匹配失败。例如:5+3

注意:要是这些条件都不满足,就返回匹配成功。匹配成功打印yes,匹配失败打印no。虽然感觉思路正确,但有时输入正确的括号也会打印no,原因是刚开始在每次输入字符串前没有把栈清空,这在代码中已修改。

#include "linkstack.h"
#include <stdio.h>

int main()
{
LinkStack ls;
InitStack(&ls);

char str[100] = {0};
while (1)
{
gets(str);
//当输入end时结束
if (strcmp(str,"end")==0)
{
break;
}
int flag = 1,i;
int len = strlen(str);

for(i=0;i < len;i++)
{
if (i != 0)
{
if (str[i] >= '0' && str[i] <= '9')
{
//如果当前符号是数字,且它的前一个字符是右括号时,则返回不匹配
if (str[i-1]==')' || str[i-1]=='}' || str[i-1]==']')
{
flag = 0;
break;
}
}
}
if(str[i]=='{'||str[i]=='('||str[i]=='[')
{
Push(&ls,str[i]);
}
else
{
//如果栈为空,则匹配
if(StackEmpty(ls) && (str[i]==')' || str[i]=='}' || str[i]==']'))
{
flag = 0;
}
else if((str[i]=='}'&&Top(ls)=='{')||(str[i]==')'&&Top(ls)=='(')||(str[i]==']'&&Top(ls)=='[')) //判断当前字符是否和栈顶元素配对,若配对,则将栈顶符号弹栈
{
Pop(&ls);
}
else
{
flag = 1;
}

}
}

//判断字符串中是否有左括号
if (strchr(str,'(') == NULL && strchr(str,'[') == NULL && strchr(str,'{') == NULL)
{
flag = 0;
}

//如果栈不为空,则返回匹配失败
if (!StackEmpty(ls))
{
//每次输入字符串前先把栈清空。
ClearStack(&ls);
flag = 0;
}

if(flag==0)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐