1. 程式人生 > >棧的應用之括號匹配問題

棧的應用之括號匹配問題

給一個字串,那這個程式是可以檢測你的字串中所含的括號是否匹配。

原理是:我們從左向右遍歷字串,如果我們遇到左括號如‘(’,我們就將這個左括號進棧,如遇到右括號‘(’,我們就將棧頂元素與該右括號比較,看他們是否匹配,若匹配,則讓棧頂元素出棧,若不匹配,則就輸出相應的提示資訊

void IsMatch(char* str)//判斷括號是否匹配,其實沒必要用老師的測試。

當然苦括號有大括號,中括號,小括號,但沒關係,這些,我的程式都可以檢測的出來。

void IsMatch(char* str)//判斷括號是否匹配,其實沒必要用老師的測試。
{
	assert(str);
	int len = strlen(str);
	Stack s;
	StackInit(&s);
	int size=0;//棧中有效元素的個數
	int i = 0;
	char top = 0;
	int left = 0;//記錄字串中左括號的個數
	int right = 0;//記錄字串中右括號的個數//")abcd]p"//"([]){}";
	for (i = 0; i < len; i++)//執行完了之後再上去迴圈
	{
		if (str[i] == '(' || str[i] == '{' || str[i] == '[')
		{
			StackPush(&s, str[i]);
			left++;
			
		}
		else//判斷括號是否匹配
		{
			if (!StackEmpty(&s))
			{
				top = StackTop(&s);
				if ((top == '(' && str[i] == ')') || (top == '{' && str[i] == '}') || top == '['&&str[i] == ']')//判斷棧頂元素與當前元素是否匹配
				{
					StackPop(&s);
					
				}
			}
		}
		if (str[i] == ']' || str[i] == ')' || str[i] == '}')
		{
			right++;
		}
		
  }
	
	size = StackSize(&s);
	printf("%d\n", size);
	if (0 == size&&0==left&&0==right)
	{
	  printf("您的輸入中不含有括號");
	}
	if (0 == size&&left==right)
	{
		printf("該字串的左右括號匹配");
	}
	if (size != 0&&left>right)
	{
      printf("首先該字串中的括號是不匹配的且該字串的左括號多於右括號");
	}
	if (0 == size && left<right)
	{
		printf("首先該字串中的括號是不匹配的且該字串的右括號多於左括號");
	}
	
}

如果有不完善的,請大家多多指正。