说实话,在栈中加一个取栈顶元素会更友好

default
修改后:
#include <iostream>
#include <stdlib.h>
#include "MyStack.h"
#include <algorithm>
#include <string>
using namespace std;
//用栈进行括号匹配
int main(void)
{
//定义两个栈
MyStack *pStack = new MyStack(30);//用于存放输入字符串的字符
MyStack *pNeedStack = new MyStack(30);//用于存放栈顶急需匹配的字符
char str[] = "[()]";
char currentNeed = 0;
for(int i = 0; i < strlen(str);i++)
{
if(str[i] != currentNeed)
{
pStack->push(str[i]);
switch(str[i])
{
case'[':
if(currentNeed != 0)//currentNeed有一个正确的值
{
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))
{
currentNeed = 0;
}
}
}
if(pStack->stackEmpty())
{
cout<<"字符串括号匹配"<<endl;
}
else
{
cout<<"字符串括号不匹配"<<endl;
}
delete pStack;
pStack = NULL;
delete pNeedStack;
pNeedStack = NULL;
return 0;
}还是有点不太理解,自己做
#include <iostream>
#include <stdlib.h>
#include "MyStack.h"
#include <algorithm>
#include <string>
using namespace std;
//用栈进行括号匹配
int main(void)
{
//定义两个栈
MyStack *pStack = new MyStack(30);//用于存放输入字符串的字符
MyStack *pNeedStack = new MyStack(30);//用于存放栈顶急需匹配的字符
char str[] = "[()]";
char currentNeed = 0;
for(int i = 0; i < strlen(str);i++)
{
if(str[i] != currentNeed)
{
pStack->push(str[i]);
switch(str[i])
{
case'[':
if(currentNeed != 0)//currentNeed有一个正确的值
{
pNeedStack->push(currentNeed);
}
currentNeed = ']';
break;
case '(':
if(currentNeed != 0)
{
pNeedStack->push(currentNeed);
}
currentNeed = ')';
break;
}
}
else
{
char elem;
pStack->pop(elem);
pNeedStack->pop(currentNeed);
}
}
if(pStack->stackEmpty())
{
cout<<"字符串括号匹配"<<endl;
}
else
{
cout<<"字符串括号不匹配"<<endl;
}
delete pStack;
pStack = NULL;
delete pNeedStack;
pNeedStack = NULL;
return 0;
}
一个栈就可以了,首先刚开始要入栈,然后接下来将栈顶元素和待匹配的下一个元素比较,如果相等则出栈,不相等则入栈,一直这样下去,直到字符串结束,最后栈中如果有剩余元素,那么就是不匹配
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; }
括号匹配需要有两个栈,第一个栈用来存放扫描到的字符,并且没有扫描到的情况;另外一个栈记载当前最急需的是哪一个字符,与当前的栈顶进行匹配