c語言棧實現括號匹配
阿新 • • 發佈:2018-12-30
在文書處理軟體或編譯程式設計時,常常需要檢查一個字串或一個表示式中的括號是否相匹配?
匹配思想:從左至右掃描一個字串(或表示式),則每個右括號將與最近遇到的那個左括號相匹配。則可以在從左至右掃描過程中把所遇到的左括號存放到堆疊中。每當遇到一個右括號時,就將它與棧頂的左括號(如果存在)相匹配,同時從棧頂刪除該左括號。
演算法思想:設定一個棧,當讀到左括號時,左括號進棧。當讀到右括號時,則從棧中彈出一個元素,與讀到的左括號進行匹配,若匹配成功,繼續讀入;否則匹配失敗,返回FLASE。另外,在演算法的開始和結束時,棧都應該是空的.所以匹配到最後還要判斷棧是否為空,若非空,則說明匹配失敗.
程式碼實現:
採用前面的順序棧結構來實現此題.
#include"sp_stack.c"
/* 輸入括號匹配,其他字元不匹配
* 以空格結束輸入
* 匹配錯誤時直接退出
* 匹配成功,返回true
* 否則返回false
*/
int match(char input[])
{
char ch;
char *str;
int result,i = 0;
scanf("%c",&ch);
/* 建立一個空棧 */
sp_stack s = (sp_stack)malloc(sizeof(stack));
s = stack_init(s);
while(ch != ' ' )
{
input[i++] = ch;
/* 判斷輸入字元是否為括號{}, (), [] */
if ( (ch == '{') || (ch == '(') || (ch == '['))
{
push(s, ch);
get_top(s, str);
}
if (ch == '}' || ch == ']' || ch == ')')
{
pop(s, str);
if (*str == ch)
{
result = true ;
scanf("%c", &ch);
continue;
}
else
return false;
}
scanf("%c", &ch);
}
if (stack_length(s) > 0)
result = false;
stack_destory(s);
return result;
}
int main()
{
int i = 0;
char input[100] = {'0'};
if(match(input) == true)
{
printf("匹配成功\n");
}
else
printf("匹配失敗\n");
printf("輸入的字串為:\n");
for (i = 0; i < 100; i ++)
{
if(input[i])
{
printf("%c", input[i]);
}
}
printf("\n");
return 0;
}