括號匹配演算法

2021-07-04 03:08:51 字數 4758 閱讀 5280

檢驗括號是否匹配的方法可以用「期待的急迫程度」這個概念來描述。

例如,考慮下列括號序列:

[ ( [ ] [ ] ) ]

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

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

}

**2:

完整的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

print

?

#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...