墓男神
2016-07-31 10:56
我没搞懂,如果有这么个字符串[([(]])),该栈要怎么实现判断,求解决
老师讲的用两个栈的没有听懂,自己想了一个办法,望采纳
Mystack<char>*pmystack=new Mystack<char>(50);
char str[]="[{()({{}}())}](([{}])){[([])]}{}()";
pmystack->Push(str[0]);//让第一个字符入栈
for(int i=1;i<strlen(str);i++)//从第二个字符开始扫描
{
if((pmystack->m_pBuffer[pmystack->m_iTop-1]=='('&&str[i]==')')||(pmystack->m_pBuffer[pmystack->m_iTop-1]=='['&&str[i]==']')||(pmystack->m_pBuffer[pmystack->m_iTop-1]=='{'&&str[i]=='}'))//如果当前扫描的字符与栈顶的前一个字符相匹配,则出栈
{
pmystack->Pop();
}
else//如果不符合就入栈
{
pmystack->Push(str[i]);
}
}
if(pmystack->stackEmpty())//如果扫面玩所有的字符栈为空,则说明全部匹配完毕
cout<<"该字符串为匹配的括号"<<endl;
else
cout<<"该字符串为不匹配的括号"<<endl;
delete pmystack;
pmystack=NULL;
#include<iostream>
using namespace std;
#include<string.h>
class Stack{
private:
char *p;
int top;
int maxsize;
public:
Stack(int size)
{
top=-1;
maxsize=size;
p=new char[size];
}
bool IsEmpty(){return (top==-1)?true:false;}
bool IsFull(){return (top==maxsize-1)?true:false;}
bool Push(char &x)
{
if(IsFull())
return false;
p[++top]=x;
return true;
}
bool Pop(char &x)
{
if(IsEmpty())
return false;
x=p[top--];
}
};
int main()
{
Stack *p=new Stack(50);
int flag=0;
char elem;
char str[51];
cin>>str;
for(int i=0;i<strlen(str);i++)
{
switch(str[i])
{
case'(':
case'{':
case'[':
p->Push(str[i]);
break;
case')':
if(p->Pop(elem)==0)
flag=1;
if(elem!='(')
flag=1;
break;
case'}':
if(p->Pop(elem)==0)
flag=1;
if(elem!='{')
flag=1;
break;
case']':
if(p->Pop(elem)==0)
flag=1;
if(elem!='[')
flag=1;
break;
}
}
if(p->IsEmpty()==0||flag==1)
cout<<"false"<<endl;
else
cout<<"true"<<endl;
return 0;
}
//一个栈实现
#include <iostream>
#include "stack.h"
using namespace std;
int main(int argc, char *argv[])
{
char p[] = "[[]()[]]]";
MyStack<char> sch(10);
char *temp = p;
char ch1 = 0,ch2 = 0;
while(*temp)
{
ch1 = *temp;
if(!sch.stackEmpty())
{
sch.pop(ch2);//取出栈顶元素
if((ch2 == '(' && ch1 == ')') || (ch2 == '[' && ch1 == ']')
|| ch2 == '{' && ch1 == '}')
{//如果取出的括号,与下一个括号匹配,则丢弃取出的括号
temp++;
continue;
}
sch.push(ch2);//如果不匹配,则放回栈里
}
sch.push(ch1);
temp++;
}
if(sch.stackEmpty())
cout << "括号匹配" << endl;
else
cout << "括号不匹配" << endl;
return 0;
}
字符串[([(]]))这种情况可以在判断是否匹配时遍历之前存起来的需要匹配的括号,如果有匹配则剔除,但这种明显不适用与该栈这种机制了
数据结构探险—栈篇
62733 学习 · 102 问题
相似问题