栈的应用之括号匹配

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

(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

你可能感兴趣的:(栈的应用之括号匹配)