第一次循环'['入栈,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;
}
即pNeedStack->popcurrentNeed为false
也就是出栈后need队列为空了,则popcurrent初始化
第三次循环()匹配 !pNeedStack->pop(currentNeed) 是一个真(true),那么然后执行currentNeed = 0; 然后下一次循环,str[i] = ' ] ', 并将str[i] 入pStack栈,' ] '既不是case1,也不是case2,然后default结束,并没有再去判断pStack是否为空,因为程序已经结束。如果不执行default直接去去判断pStack是否为空,也是可以的,因为pStack里面还有 一个 ' ] ' ,并不为空,照样能输出不匹配。我倒觉得不用写default,只是个人一点意见哈,有其他想法也愿闻其详!
是这个意思,你看看pop的定义就能知道是你说的意思!
第三次循环( )匹配,'(' 弹出,然后if(!pNeedStack->pop(currentNeed)){currentNeed=0;}是false不执行,那么这时currentNeed还是等于 ')' 的吗? : if(!pNeedStack->pop(currentNeed)){currentNeed=0;}这个的意思是如果真则currentNeed=0;如果false则pNeedStack->pop(currentNeed).也就是从pNeedStack这个栈中出栈,而出栈的值也被赋值给currentNeed 是不是这个意思
如果if(!pNeedStack->pop(currentNeed)){currentNeed=0;} 括号里面的条件是false,就相当于!pNeedStack->pop(currentNeed) 这句话是错的,注意前面的“!”,这句话要是错的,那么pNeedStack->pop(currentNeed) 就为真, 这句话本身也是一个出栈的操作,所以说,如果是真的话,会有东西出栈的,存到了currentNeed中。