從第三次循環開始想不明白但是運行結果是正確的
第一次循環'['入棧,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;
}
2019-06-24
即pNeedStack->popcurrentNeed為false
也就是出棧后need隊列為空了,則popcurrent初始化
2016-12-25
第三次循環()匹配?????? !pNeedStack->pop(currentNeed)?? 是一個真(true),那么然后執行currentNeed = 0;? 然后下一次循環,str[i] = ' ] ', 并將str[i] 入pStack棧,' ] '既不是case1,也不是case2,然后default結束,并沒有再去判斷pStack是否為空,因為程序已經結束。如果不執行default直接去去判斷pStack是否為空,也是可以的,因為pStack里面還有 一個 ' ] ' ,并不為空,照樣能輸出不匹配。我倒覺得不用寫default,只是個人一點意見哈,有其他想法也愿聞其詳!
2016-10-13
是這個意思,你看看pop的定義就能知道是你說的意思!
2016-10-09
第三次循環( )匹配,'(' 彈出,然后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
如果if(!pNeedStack->pop(currentNeed)){currentNeed=0;} ?括號里面的條件是false,就相當于!pNeedStack->pop(currentNeed) 這句話是錯的,注意前面的“!”,這句話要是錯的,那么pNeedStack->pop(currentNeed) 就為真, 這句話本身也是一個出棧的操作,所以說,如果是真的話,會有東西出棧的,存到了currentNeed中。