从第三次循环开始想不明白但是运行结果是正确的
第一次循环'['入栈,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;
}