c++实现的括号匹配,通过链栈方式


/*
表达式中的括号是否匹配
*/

bool CLinkSta::IsMatch(DataType* str)
{
if( NULL == str ) return false;

while( m_node )
{
PopLinkStack();
}
CLinkNode* stack1 = NULL;
CLinkNode* stack2 = NULL;
CLinkNode* pNode1 = NULL;
CLinkNode* pNode2 = NULL;
DataType* cTemp = str;
while( *cTemp )
{
if( *cTemp == '(' || *cTemp == '[' || *cTemp == '{' )
{
pNode1 = new CLinkNode;
pNode1->m_Ch = *cTemp;
pNode1->next = stack1;
stack1 = pNode1;
}
else if( *cTemp == ')' || *cTemp == ']' || *cTemp == '}' )
{

pNode2 = new CLinkNode;
pNode2->m_Ch = *cTemp;
pNode2->next = stack2;
stack2 = pNode2;
}
++cTemp;
}
int nCnt = 0;
while( stack1 && stack2 )
{
stack1 = stack1->next;
stack2 = stack2->next;
}
while( stack1 && stack2 )
{
CLinkNode* pTemp1 = stack1;
CLinkNode* pTemp2 = stack2;
stack1 = stack1->next;
stack2 = stack2->next;
DataType ch = pTemp1->m_Ch;
switch( ch )
{
case ')':
ch = '(';
break;
case ']':
ch = '[';
break;
case '}':
ch = '{';
break;
}

if( ch != pTemp2->m_Ch )
{
++nCnt;
break;
}
delete pTemp1;
delete pTemp2;
}

if( !nCnt && !stack1 && !stack2 )
{
return true;
}
else
{
while( stack1 )
{
CLinkNode* pTemp1 = stack1;
stack1 = stack1->next;
delete pTemp1;
}
while( stack2 )
{
CLinkNode* pTemp2 = stack2;
stack2 = stack2->next;
delete pTemp2;
}
while( *str )
{
if( *str == '(' || *str == '[' || *str == '{' )
{
PushLinkStack(*str);
}
else if( *str == ')' || *str == ']' || *str == '}' )
{
if( !m_node )
{
return false;
}
else
{
DataType ch = *str;
switch( ch )
{
case ')':
ch = '(';
break;
case ']':
ch = '[';
break;
case '}':
ch = '{';
break;
}

if( ch != PopLinkStack() )
{
return false;
}
}
}
++str;
}

if( !m_node )
{
return true;
}
}
return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值