问答详情
源自:4-4 栈应用括号匹配二

括号的匹配

我没搞懂,如果有这么个字符串[([(]])),该栈要怎么实现判断,求解决

提问者:墓男神 2016-07-31 10:56

个回答

  • 未道修
    2016-08-01 19:34:36
    已采纳

    老师讲的用两个栈的没有听懂,自己想了一个办法,望采纳

    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;


  • 风偏偏
    2018-05-22 20:39:56

    #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;


    }


  • kming
    2016-08-27 18:00:24

    //一个栈实现

    #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;
    }

  • sardipeng
    2016-08-01 19:42:27

    字符串[([(]]))这种情况可以在判断是否匹配时遍历之前存起来的需要匹配的括号,如果有匹配则剔除,但这种明显不适用与该栈这种机制了