1. 程式人生 > >C語言_解決括號匹配問題和逆波蘭表示式求值為題

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);
}

執行結果:
這裡寫圖片描述

###2、逆波蘭表示式求值

####什麼是逆波蘭表示式:

逆波蘭表示法也叫字尾表示法,即操作符號都置於運算元的後面,逆波蘭表示法可以不用括號來標識操作符的優先順序。例如:3+4 是一箇中綴表示式,轉換成逆波蘭表示式為34+

思路:

這裡寫圖片描述

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語言_順序棧的基本操作”