判断一个字符串中括号是否匹配C++,跪求高手帮忙看看
从键盘读入一个字符串,其中只含有(){}[],判断该字符串中的每种括号是否成对出现。提示:可借助栈来实现,括号必须配对出现,如()[]{},这是匹配的括号,如([{])}...
从键盘读入一个字符串,其中只含有() {} [ ] ,判断该字符串中的每种括号是否成对出现。
提示:可借助栈来实现,括号必须配对出现,如()[ ]{},这是匹配的括号,如([{])},这是不匹配的括号(中间无空格)。
输入样例:
(([{}]))
输出样例:
yes
然后我的代码是这样,如果我的代码写的不对,请大神附赠正确完整的代码,谢谢~
#include<iostream>
#include<string>
#include<stack>
using namespace std;
class seq
{
public:
seq(){top=-1;}
void push(char x);
char pop();
void empty();
char K();
private:
int data[100];
int top;
};
void seq::push(char x)
{
if(top==99){cout<<"no"<<endl;return;}
data[++top]=x;
}
char seq::pop()
{
char x;
if(top==-1){cout<<"no"<<endl;return 0;}
x=data[top--];
return x;
}
void seq::empty()
{
if(top==-1)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
char seq::K()
{
char L;
for(int i=0;i<100;i++)
L=data[i];
return L;
}
int main()
{
char n;
seq A;
while(1)
{
cin>>n;
switch(n)
{
case'(':
case'[':
case'{':
A.push(n);break;
case')':
if(A.K()==')')
{A.pop();cout<<"no"<<endl;}
else
{
cout<<"yes"<<endl;
}break;
case']':
if(A.K()==']')
{A.pop();cout<<"no"<<endl;}
else
{
cout<<"yes"<<endl;
}break;
case'}':
if(A.K()=='}')
{A.pop();cout<<"no"<<endl;}
else
{
cout<<"yes"<<endl;
}break;
}
}
return 0;
}
死循环,然而我看不出错在哪(新手,请大神指教) 展开
提示:可借助栈来实现,括号必须配对出现,如()[ ]{},这是匹配的括号,如([{])},这是不匹配的括号(中间无空格)。
输入样例:
(([{}]))
输出样例:
yes
然后我的代码是这样,如果我的代码写的不对,请大神附赠正确完整的代码,谢谢~
#include<iostream>
#include<string>
#include<stack>
using namespace std;
class seq
{
public:
seq(){top=-1;}
void push(char x);
char pop();
void empty();
char K();
private:
int data[100];
int top;
};
void seq::push(char x)
{
if(top==99){cout<<"no"<<endl;return;}
data[++top]=x;
}
char seq::pop()
{
char x;
if(top==-1){cout<<"no"<<endl;return 0;}
x=data[top--];
return x;
}
void seq::empty()
{
if(top==-1)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
char seq::K()
{
char L;
for(int i=0;i<100;i++)
L=data[i];
return L;
}
int main()
{
char n;
seq A;
while(1)
{
cin>>n;
switch(n)
{
case'(':
case'[':
case'{':
A.push(n);break;
case')':
if(A.K()==')')
{A.pop();cout<<"no"<<endl;}
else
{
cout<<"yes"<<endl;
}break;
case']':
if(A.K()==']')
{A.pop();cout<<"no"<<endl;}
else
{
cout<<"yes"<<endl;
}break;
case'}':
if(A.K()=='}')
{A.pop();cout<<"no"<<endl;}
else
{
cout<<"yes"<<endl;
}break;
}
}
return 0;
}
死循环,然而我看不出错在哪(新手,请大神指教) 展开
展开全部
你的理解应该有一点点错,应该是一次全部输入后再来判断,按你要求打了一个c++的(有详细注释),可以参考下,加油!
#include<iostream>
#include<string>
using namespace std;
class cstack
{
public:
cstack(){
//初始化容量为100,并将top指向栈顶
capacity=100;
cdata = new char[capacity];
top=0;
}
~cstack(){
//回收分配的内存
delete cdata;
}
int push(char c){
//当栈容量满时,容量自动翻倍
if(top == capacity-1)
{
capacity *= 2;
char* cdata_old = cdata;
char* cdata_new = new char[capacity];
for(int i=0;i<capacity/2;i++)cdata_new[i]=cdata_old[i];
cdata = cdata_new;
delete cdata_old;
}
//入栈
cdata[top++]=c;
//检查栈顶是否有匹配的符号对
check();
}
bool isEmpty()
{
if(top==0)return true;
else return false;
}
private:
void check(){
//当元素不足2个时(top为0时无元素 top为1时只有1个元素 ),无需检查
if(top<2)return;
//当匹配时出栈两个元素(即top-=2)
if((cdata[top-2]=='('&&cdata[top-1]==')')||(cdata[top-2]=='{'&&cdata[top-1]=='}')
||(cdata[top-2]=='['&&cdata[top-1]==']'))
top-=2;
}
int top; //指向栈顶
int capacity; //栈当前容量
char* cdata; //栈数据
};
int main()
{
cstack cs;
char charArray[1000];
//输入字符串
cin >> charArray;
int i=0;
while(charArray[i]!='\0')
{
//将每个元素依次压栈,push 里面有check 会自动检查匹配的字符串并出栈
cs.push(charArray[i]);
i++;
}
//如果最后栈为空,说明全部匹配成功,否则失败
if(cs.isEmpty())cout<< "yes";
else cout << "no";
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询