檢驗括號是否匹配的方法可以用「期待的急迫程度」這個概念來描述。
例如,考慮下列括號序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的卻是第二個括號,此時第乙個括號「[」只能暫時靠邊,而迫切等待與第二個括號相匹配的、第七個括號「)」的出現,類似地,因等來的是第三個括號「[」,其期待匹配的程度較第二個括號更急迫,則第二個括號也只能靠邊,讓位於第三個括號,顯然第二個括號的期待急迫性高於第乙個括號;在接受了第四個括號之後,第三個括號的期待得到滿足,消解之後,第二個括號的期待匹配就成為當前最急迫的任務了,……依此類推。
很顯然,這樣的乙個處理過程和棧的特點非常吻合,因此,這個問題可以用棧來解決。
解決思路:
1.在演算法中設定乙個棧,每次讀入乙個括號;
2.若是右括號,則或者使置於棧頂的最急迫的期待得以消解,此時將棧頂的左括號彈出;或者是不合法的情況,此時將右括號壓入;
3.若是左括號,則作為乙個新的更急迫的期待壓入棧中,自然使原有的在棧中的所有未消解的期待的急迫性都降低一級;
4.在演算法的開始和結束時,棧應該為空。
**1:
stack是乙個已實現的棧,
可使用的相關型別和函式:
typedef char selemtype; // 棧stack的元素型別
status initstack(stack &s);
status push(stack &s, selemtype e);
status pop(stack &s, selemtype &e);
status stackempty(stack s);
status gettop(stack s, selemtype &e);
1**2:status matchcheck(sqlist exp)2/*
順序表exp表示表示式; */3
/*若exp中的括號配對,則返回true,否則返回false */4
15else
if(exp.elem[i]==')
')//若遇右圓括號,則嘗試匹配棧頂括號
16
23else
//匹配不成功,右圓括號入棧
24
27}
28else
//棧為空,則將右括號入棧29
32}33else
if(exp.elem[i]=='}
')//若遇右花括號,則嘗試匹配棧頂括號
34
41else
//匹配不成功,右花括號入棧
42 45}
46else47
50}51else
if(exp.elem[i]==']
')//若遇右方括號,則嘗試匹配棧頂括號
52
59else
//匹配不成功,右方括號入棧
60 63}
64else65
68}69}
70if
(stackempty(s))
//當所有括號匹配成功時,棧應為空
7174
else
7578
}
完整的c程式,該演算法的時間複雜性為o(n),其中n為輸入串的長度:
1#include
"stdio.h"2
#include
"string.h"3
#include
"stdlib.h"4
56#define
stacksize 100
//假定預分配的棧空間最多為100個元素
7#define
maxlength 100
//最大的字串長度89
typedef
intdatatype;
//假定棧元素的資料型別為整數
10typedef
struct
11seqstack;
1516
void
initial(seqstack
*s);
17int
isempty(seqstack
*s);
18int
isfull(seqstack
*s);
19void
push(seqstack
*s, datatype x);
20datatype pop(seqstack
*s);
21datatype top(seqstack
*s);
22void
printmatchedpairs(
char
*expr);
2324
25void
main(
void)26
3839
//置棧空
40void
initial(seqstack *s)
4144
45//
判斷棧是否空
46int
isempty(seqstack *s)
4750
51//
判斷棧是否滿
52int
isfull(seqstack *s)
5356
57//
進棧58
void
push(seqstack
*s, datatype x)
5965
66s
->
data[
++s
->
top]
=x;
6768
return;69
}7071//
出棧72
datatype pop(seqstack *s)
7379
80return
s ->
data[s
->
top--
]; //
棧頂指標加1後將x入棧81}
8283
//取棧頂元素
84datatype top(seqstack *s)
8591
92return
s ->
data[s
->
top];93}
9495
//括號匹配
96void
printmatchedpairs(
char
*expr)
97109
else
if(expr[i -1
] ==')
')110116
else
117120
}121
}122
123while(!
isempty(
&s))
124128
}
**3:演算法:檢測表示式中的字元,若是左括號就入棧,如果是右括號就出棧乙個元素與其配對,配對成功則繼續訪問下乙個字元,否則退出。出現非括號字元則跳過。
[cpp]view plain
copy
?
#include
#include //malloc,realloc
#include //含有overflow
#include //exit()
#define s_size 100 //棧的空間大小
#define stackincreament 10//增加空間
struct
sqstack;
void
main()
的括號表示式:\n"
);
gets(ch);
while
(*p)
':
case
']':
case
')':pop(s,e);
if((e==
'') ||(e==
'['&& *p==
']') || (e==
'('&& *p==
')'))
p++;
else
break
; default
:p++;
//其他字元就後移
} }
if(stackempty(s))
printf("括號匹配成功"
);
else
printf("缺少右括號!"
);
printf("\n"
);
} void
initstack(sqstack &s)
intstackempty(sqstack s)
void
push(sqstack &s,
inte)
*(s.top)=e;
s.top++;
} void
pop(sqstack &s,
int&e)
}
括號匹配演算法
題目 有一段字串,包含 和 和 中的一種或者多種,這三種括號出現次序不定,可隨意巢狀。編寫 判斷三種括號是否正確匹配。思路一 棧的思想 括號匹配是運用棧的經典思想。在 演算法中設定乙個空棧,每次讀入乙個括號,若是左括號,則壓入棧中,等到對應的右括號壓棧,若是右括號,能使置於棧頂的最急迫的期待得以消解...
括號匹配演算法
括號匹配在很多字串處理的場景中時常被用到,諸如各大ide括號不匹配的錯誤提示,編譯器編譯時檢查應該成對出現的括號是否符合要求等,在這裡我們就直接使用一種比較常規,但效率不差的方法去解決括號匹配的問題就行了。為了方便描述,對於需要做匹配的兩個符號,比如 和 前者可稱為左側符號,後者可稱為右側符號。在做...
驗證括號匹配 演算法
include include define maxsize 100 typedef structstack bool initstack stack s bool push stack s,char e bool pop stack s,char e bool gettop stack s,cha...