括号匹配问题--栈实现

转自:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html

1.如果使用number计数的话,只能使用与单个括号匹配,对于多个括号不适用

2.括号不可是html中的标签,只需约定括号的通用格式

/*

括号匹配问题,比较经典,利用堆栈来实现(摘自internet)

1. 括号匹配的四种可能性:

①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确

2. 算法思想:

顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;
若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号;
字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;
否则,括号配对正确。

3. 程序实现:

*/

#include 

<
iostream
>


using
 
namespace
 std;


#define
 maxsize 100


struct
 sStack
{
     

char
 sign[maxsize];
     

int
 top;
};


int
 InitsStack(sStack 
&
SS)
{
     SS.top

=-
1
;
     

return
 
1
;
}


int
 IsEmptysStack(sStack 
&
SS)
{
     

if
(SS.top
==-
1
)

         return
 
1
;
     

return
 
0
;
}


int
 PushsStack(sStack 
&
SS,
char
 c)
{
     SS.sign[

++
SS.top]
=
c;
     

return
 
1
;
}


int
 UpsStack(sStack 
&
SS)
{
    

if
(IsEmptysStack(SS))
    {
         cout

<<

栈空

<<
endl;
         

return
 
0
;
    }
    SS.top


;
    

return
 
1
;
}


char
 TopsStack(sStack 
&
SS)
{
    

if
(IsEmptysStack (SS))
    {
         cout 

<<

栈空

<<
endl;
         

return
 
0
;
    }
    

return
 SS.sign[SS.top];
}


int
 main()
{
     

string
 s;
     cout

<<

输入表达式:

;
     cin

>>
s;
     

int
 length
=
s.length();
     

int
 i;
     sStack SS;
     InitsStack(SS);
     

for
(i
=
0
;i
<
length;
++
i)
     {
           

if
(s[i]
==

(

||
s[i]
==

[

||
s[i]
==

{

)
                    PushsStack(SS,s[i]);
           

else
 
if
(s[i]
==

)

&&!
IsEmptysStack(SS)
&&
TopsStack(SS)
==

(

)
                UpsStack(SS);         
           

else
 
if
(s[i]
==

)

&&!
IsEmptysStack(SS)
&&
TopsStack(SS)
!=

(

)
                    cout

<<

括号匹配次序不正确

<<
endl;
           

else
 
if
(s[i]
==

]

&&!
IsEmptysStack(SS)
&&
TopsStack(SS)
==

[

)
                    UpsStack(SS);
           

else
 
if
(s[i]
==

]

&&!
IsEmptysStack(SS)
&&
TopsStack(SS)
!=

[

)
                    cout

<<

括号匹配次序不正确

<<
endl;
           

else
 
if
(s[i]
==

}

&&!
IsEmptysStack(SS)
&&
TopsStack(SS)
==

{

)
                    UpsStack(SS);
           

else
 
if
(s[i]
==

}

&&!
IsEmptysStack(SS)
&&
TopsStack(SS)
!=

{

)
                    cout

<<

括号匹配次序不正确

<<
endl;
           

else
 
if
((s[i]
==

)

||
s[i]
==

]

||
s[i]
==

}

)
&&
IsEmptysStack(SS))
                    cout

<<

右括号多于左括号

<<
endl;
     }
     

if
(
!
IsEmptysStack(SS))
           cout

<<

左括号多于右括号

<<
endl;
     

else
 
if
(i
=
(length

1
)
&&
IsEmptysStack(SS))
           cout

<<

括号匹配正确

<<
endl;
               
     system(


PAUSE

);
     

return
 
0
;
}

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/u011271202/article/details/38025001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞