有效左右括號判斷——C語言實現完整判斷流程

                         QQ:3020889729                                                                                 小蔡

特別說明

本文主旨在於將題目中的棧方法給以流程展示,用於解答需要刪除部分printf語句。

題目簡述

給定一個括號字符串,形如"{}{}()[]"、"{[()]}"等。
要求:

  1. 總是存在左括號與右括號一一配對;(len % 2 == 0)
  2. 左括號必須以正確的順序與右括號閉合。

思路

採用棧方法,因爲總是左右括號對應,所以,字符串長度應該是正偶數(2n).
其次,左括號總是以正確的順序與右括號閉合——所以不妨將左括號依次押入棧中,當遇見右括號時,立即將它與當前的棧頭進行匹配,匹配成功,棧減一;繼續查找括號進行壓棧或匹配。

代碼實現

補充說明:這裏採用對輸入數據進行清理,把空格去掉——因爲空格在題目中是有效字符串,所以可以忽略。

#include<stdio.h>
#include<string.h>

int main()
{
	char a[40], c[40]={'\0'};  // a->輸入數據   c->清理後的輸入數據
	int len;
	printf("請輸入待判斷的括號數據:");
	gets(a);
	len = strlen(a);
	printf("\n輸入數據的情況:a :%s\nlen = %d", a, len);
	
	for(int i = 0, j = 0; i < len; i++)
	{
		if(a[i] == '{' || a[i] == '}' || a[i] == '[' || a[i] == ']' || a[i] == '(' || a[i] == ')')
		{
			c[j] = a[i];
			j++;
		}
	}  
	len = strlen(c);
	printf("\n數據清理結果:%s\nlen = %d", c, len);
	
	char b[101]={'\0'};
	int mid = 0, top = 0, next = 0, flag = 1;
	if(len %2 == 0)
	{
		for(int i = 0; i < len; i++)
		{
			if(c[i] == '{' || c[i] == '[' || c[i] == '(')
			{
				b[++top] = c[i];  // 把左括號壓進去 
				printf("\n\n當前壓入數據:%c, 棧頭標記爲:top = %d", b[top], top);
			}
			if(c[i] == '}' || c[i] == ']' || c[i] == ')')
			{
				printf("\n當前押出匹配的數據:%c, 待匹配數據爲:%c", b[top], c[i]);
				switch(c[i])
				{
					case '}': 
							if(b[top--] != '{')
							{
								flag = 0;
								printf("\t本次匹配失敗!\t 當前棧頭爲:top = %d \t 棧頭(top = 0)說明棧爲空!", top);
								break;
							}
							printf("\t本次匹配成功!\t 當前棧頭爲:top = %d \t 棧頭(top = 0)說明棧爲空!", top);	
							break;
					case ']':
							if(b[top--] != '[')
							{
								flag = 0;
								printf("\t本次匹配失敗!\t 當前棧頭爲:top = %d \t 棧頭(top = 0)說明棧爲空!", top);
								break;
							}
							printf("\t本次匹配成功!\t 當前棧頭爲:top = %d \t 棧頭(top = 0)說明棧爲空!", top);	
							break;
					case ')':
							if(b[top--] != '(')
							{
								flag = 0;
								printf("\t本次匹配失敗!\t 當前棧頭爲:top = %d \t 棧頭(top = 0)說明棧爲空!", top);
								break;
							}
							printf("\t本次匹配成功!\t 當前棧頭爲:top = %d \t 棧頭(top = 0)說明棧爲空!", top);	
							break;
					default:break;
				}
				
				if(flag == 0)
				{
					break;
				}
			}
		}
		if(flag == 0)
			printf("\n\n匹配失敗,括號無效,請更正!");
		else
			printf("\n\n匹配成功,括號有效!");
	}
	else
	{
		printf("\n\n匹配失敗,括號無效,請更正!");
	}
	
	getchar();
	getchar();
	return 0;
}


測試案例

/*
測試數據:
[][][][][]  √ 
[([])]   √ 
{{}()[]]   × 
{([])}   √ 
{()([])}   √ 
{([])()}   √ 
*/ 

結果展示以“{{}()[]]"爲例
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章