为了账号安全,请及时绑定邮箱和手机立即绑定

括号的匹配

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

正在回答

4 回答

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

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;


2 回复 有任何疑惑可以回复我~
#1

墓男神 提问者

非常感谢!
2016-08-04 回复 有任何疑惑可以回复我~
#2

慕粉3631940

厉害 !
2016-10-13 回复 有任何疑惑可以回复我~
#3

菠萝1230

不过你这是把栈类属性全改为public了么?
2017-02-19 回复 有任何疑惑可以回复我~

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


}


1 回复 有任何疑惑可以回复我~
#1

qq__cnszBQ

请问这是用的 顺序存储结构 吗
2018-11-10 回复 有任何疑惑可以回复我~

//一个栈实现

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

1 回复 有任何疑惑可以回复我~

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

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
数据结构探险—栈篇
  • 参与学习       62733    人
  • 解答问题       102    个

栈,先入后出(FILO),带领大家体会栈这种数据结构的美妙

进入课程

括号的匹配

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信