括号匹配问题--栈实现

转自: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 ;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值