判断一个字符串中括号是否匹配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;
}

死循环,然而我看不出错在哪(新手,请大神指教)
展开
 我来答
摆渡勇虎
2016-10-11 · TA获得超过857个赞
知道答主
回答量:84
采纳率:100%
帮助的人:29万
展开全部

你的理解应该有一点点错,应该是一次全部输入后再来判断,按你要求打了一个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;
}
百度网友2018359
2016-10-11 · TA获得超过3494个赞
知道大有可为答主
回答量:3486
采纳率:73%
帮助的人:1406万
展开全部
没看别的,就看到你的
while(1) 中没有break ,肯定死循环啊
switch中的break 对while没有影响
更多追问追答
追问
可是在while中加入break后,运行的时候输入字符后就直接结束了,yes都没有输出唉
追答
你要满足一定条件才break啊,不要直接就break,那不直接就退出while了么
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式