问答详情
源自:4-4 栈应用括号匹配二

从第三次循环开始想不明白但是运行结果是正确的

第一次循环'['入栈,currentNeed=']'

第二次循环'('入栈,']'入Need栈,currentNeed=')'

第三次循环()匹配,‘(’弹出,然后if(!pNeedStack->pop(currentNeed)){currentNeed=0;}是false不执行,那么这时currentNeed还是等于‘)’的吗?

第四次循环‘]’就不与currentNeed相等了,然后执行if(str[i]!=currentNeed),当前‘]’就入栈了,既不符合case1,也不符合case2,然后就会执行default输出字符不匹配

所以到这里我就开始不懂了,但是执行结果是正确的

代码:

#include<iostream>

#include<stdlib.h>

#include<string>

#include"MyStack.h"

//#include"Coordinate.h"

using namespace std;


int main(void)

{

MyStack<char> *pStack=new MyStack<char> (30);//用来存放扫描字符串当中所找到的字符

MyStack<char> *pNeedStack=new MyStack<char> (30);//记录栈顶急需的字符


char str[]="[()]]";

char currentNeed=0;//表示当前需要的字符,赋初值用ARIS码

for(int i=0;i<strlen(str);i++)

{

if(str[i]!=currentNeed)

{

pStack->push(str[i]);

switch(str[i])

{

case'[':

if(currentNeed!=0)

{

pNeedStack->push(currentNeed);

}

currentNeed=']';

break;

case'(':

if(currentNeed!=0)

{

pNeedStack->push(currentNeed);

}

currentNeed=')';

break;

default://为了适用于后面有多出来的情况,例如:[()]]

cout<<"字符串不匹配"<<endl;

return 0;

}

}

else

{

char elem;

pStack->pop(elem);

if(!pNeedStack->pop(currentNeed))//判断出栈是否正确,如果栈里没有可pop出的字符就要赋值0

{

currentNeed=0;

}

}

}

if(pStack->stackEmpty())

{

cout<<"字符串括号匹配"<<endl;

}

else

{

cout<<"字符串括号不匹配"<<endl;

}

delete pStack;

pStack=NULL;

delete pNeedStack;

pNeedStack=NULL;

return 0;

}




提问者:Lydia_Lv 2016-05-28 13:55

个回答

  • qq_沐雨随心_03616087
    2019-06-24 00:30:02

    即pNeedStack->popcurrentNeed为false
    也就是出栈后need队列为空了,则popcurrent初始化

  • 黑巫师0
    2016-12-25 14:02:51

    第三次循环()匹配       !pNeedStack->pop(currentNeed)   是一个真(true),那么然后执行currentNeed = 0;  然后下一次循环,str[i] = ' ] ', 并将str[i] 入pStack栈,' ] '既不是case1,也不是case2,然后default结束,并没有再去判断pStack是否为空,因为程序已经结束。如果不执行default直接去去判断pStack是否为空,也是可以的,因为pStack里面还有 一个 ' ] ' ,并不为空,照样能输出不匹配。我倒觉得不用写default,只是个人一点意见哈,有其他想法也愿闻其详!

  • 慕粉3631940
    2016-10-13 17:08:43

    是这个意思,你看看pop的定义就能知道是你说的意思!

  • 慕瓜4070492
    2016-10-09 11:44:25

    第三次循环( )匹配,'(' 弹出,然后if(!pNeedStack->pop(currentNeed)){currentNeed=0;}是false不执行,那么这时currentNeed还是等于 ')' 的吗? :  if(!pNeedStack->pop(currentNeed)){currentNeed=0;}这个的意思是如果真则currentNeed=0;如果false则pNeedStack->pop(currentNeed).也就是从pNeedStack这个栈中出栈,而出栈的值也被赋值给currentNeed      是不是这个意思

  • 我呵呵了
    2016-06-25 16:03:05

    如果if(!pNeedStack->pop(currentNeed)){currentNeed=0;}  括号里面的条件是false,就相当于!pNeedStack->pop(currentNeed) 这句话是错的,注意前面的“!”,这句话要是错的,那么pNeedStack->pop(currentNeed) 就为真, 这句话本身也是一个出栈的操作,所以说,如果是真的话,会有东西出栈的,存到了currentNeed中。