C语言_解决括号匹配问题和逆波兰表达式求值为题

##1、括号匹配问题:

解决思路:
C语言_解决括号匹配问题和逆波兰表达式求值为题_第1张图片

void MatchBrackets (const char* str)
{
	char* per = NULL;
	int i = 0;
	Stack s;
	assert (str != NULL);
	InitStack (&s);
	per = (char*)str;

	for (i=0; per[i] != 0; i++)
	{
		if ('(' == per[i] || '[' == per[i] || '{' == per[i])
		{
			PushStack (&s, per[i]);//入栈
		}
		else if (')' == per[i] || ']' == per[i] || '}' == per[i])
		{
			char ch ;
			if (IsEmpty (&s) == 1)//判断栈是否为空(等一为空,等零不为空)
			{
				printf ("右括号比左括号多!!!\n");
				return ;
			}
			ch = TopNumAndTop (&s);//返回栈顶元素并出栈
			switch (ch)
			{
			case '(':
				if (per[i] != ')')
				{
					printf ("左右括号次序匹配错误!!!\n");
					return ;
				}
				break;
			case '[':
				if (per[i] != ']')
				{
					printf ("括号不匹配!!!\n");
					return ;
				}
				break;
			case '{':
				if (per[i] != '}')
				{
					printf ("括号不匹配!!!\n");
					return ;
				}
				break;
			}
		}
	}
	if (IsEmpty (&s) == 1)  //判断栈是否为空(等1为空,等0不为空)
	{
		printf ("括号匹配正确!!!\n");
	}
	else
	{
		printf ("左括号比右括号多!!\n");
	}
}

测试代码:

void test_Match_Brackets()	//括号匹配问题
{
	char arr1[] = "(())abc{[()]}}";//右括号比左括号多
	char arr2[] = "(())abc{[(])}";//左右括号次序匹配错误
	char arr3[] = "(())abc{[]}";	//左右括号匹配正确
	char arr4[] = "(([]))abc{{([])}";	//左括号比右括号多
	MatchBrackets (arr1);
	MatchBrackets (arr2);
	MatchBrackets (arr3);
	MatchBrackets (arr4);
}

运行结果:
C语言_解决括号匹配问题和逆波兰表达式求值为题_第2张图片

###2、逆波兰表达式求值

####什么是逆波兰表达式:

逆波兰表示法也叫后缀表示法,即操作符号都置于操作数的后面,逆波兰表示法可以不用括号来标识操作符的优先级。例如:3+4 是一个中缀表达式,转换成逆波兰表达式为34+

思路:

C语言_解决括号匹配问题和逆波兰表达式求值为题_第3张图片

int ReversePolishExpression (const char* str)	//逆波兰表达式求值
{
	Stack s;
	char* arr;
	int i = 0;
	assert (str != NULL);
	InitStack (&s);
	arr = (char*)str;
	
	while (*arr)
	{
		char* p1 = arr;
		while (*arr != ' ' && *arr != '+' && *arr != '-' && *arr != '*' && *arr != '/')
		{
			arr++;
		}
		if (*arr == ' ' && *p1 != ' ')
		{
			*arr = '\0';
			PushStack (&s, StrToA (p1));
		}
		if ((*arr == '+') || (*arr == '-') || (*arr == '*') || (*arr == '/'))
		{
			DataType a = TopNumAndTop (&s);
			DataType b = TopNumAndTop (&s);

			switch (*arr)
			{
			case '+':
				PushStack (&s, b+a);
				break;
			case '-':
				PushStack (&s, b-a);
				break;
			case '*':
				PushStack (&s, b*a);
				break;
			case '/':
				PushStack (&s, b/a);
				break;
			}
		}
		 
		arr++;
	}
	return TopNumAndTop (&s);
}

测试代码:

void test_ReversePolishExpression ()//逆波兰表达式
{
	char arr[] = "12 3 4 + * 6 - 8 2 / +";
	printf ("%d\n", ReversePolishExpression(arr));;
}

运行结果:

C语言_解决括号匹配问题和逆波兰表达式求值为题_第4张图片

注:关于本片博客里的栈的操作,可以参考上一篇博客“C语言_顺序栈的基本操作”

你可能感兴趣的:(C语言_数据结构)