栈的应用之括号匹配

括号匹配问题:给你一串字符串,判断其中的括号是否匹配,如下几种情况:

(1)  adaf[jskdf]jjkl(121)mksfsdl{}     匹配

(2)  nkdksl(djlk[12njs{232332jn}])    匹配

(3)  6237[jjsfj(kk222]jn23d)         不匹配

(4)  ]121ndsfs[jfksfs                不匹配

该算法的主要思想是,从左至右扫描整个字符串,当遇到左括号如[(、{等时,将其进栈,当遇到右括号时,如]、)、}时,判断栈顶元素是否与其相对应的左括号匹配,如匹配,则删除栈顶元素,继续扫描下一个字符。最后,当所有元素都扫描完后,如果栈为空,则匹配,否则不匹配。

注意的是,在扫描时当遇到右括号时,当栈为空或者栈顶元素与其不匹配时,则可以返回,该串一定是括号不匹配的。

算法代码如下:

#include <stdio.h>

#define  MAXSIZE  100

typedef struct tagstack
{
	char data[MAXSIZE];
	int top;
}stack;


int ParenthesisMatch(char *str)
{
	stack s;
	s.top = -1;
	int i = 0;
	while (str[i]!='\0')
	{
		switch (str[i])
		{
		case '(':
		case '[':
		case '{':
			{
				s.top ++;
				s.data[s.top] = str[i];
				break;
			}
		case ')':
			{
				if (s.top!=-1&&s.data[s.top]=='(')
				{
					s.top --;
				}
				else //s.top==-1说明第一个就是反括号
				{
					return 0;
				}
				break;
			}
		case ']':
			{
				if (s.top!=-1&&s.data[s.top]=='[')
				{
					s.top --;
				}
				else
				{
					return 0;
				}
				break;
			}
		case '}':
			{
				if (s.top!=-1&&s.data[s.top]=='{')
				{
					s.top --;
				}
				else
				{
					return 0;
				}
				break;
			}
		}
		i++;
	}
		

	if (s.top==-1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


void main(void)
{
	char str[]="{d(f[11)c]c}";
	if (ParenthesisMatch(str)==1)
	{
		printf("Match!\n");
	}
	else if (ParenthesisMatch(str)==0)
	{
		printf("Not Match!\n");
	}
}


本文word版下载地址: http://pan.baidu.com/share/link?shareid=2431221916&uk=4213349809

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值