QQ:3020889729 小蔡
特別說明
本文主旨在於將題目中的棧方法給以流程展示,用於解答需要刪除部分printf語句。
題目簡述
給定一個括號字符串,形如"{}{}()[]"、"{[()]}"等。
要求:
- 總是存在左括號與右括號一一配對;(len % 2 == 0)
- 左括號必須以正確的順序與右括號閉合。
思路
採用棧方法,因爲總是左右括號對應,所以,字符串長度應該是正偶數(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;
}
測試案例
/*
測試數據:
[][][][][] √
[([])] √
{{}()[]] ×
{([])} √
{()([])} √
{([])()} √
*/
結果展示:以“{{}()[]]"爲例