• 括号匹配


    描述
    假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.

    输入一串括号
    如果输入的右括号多余,输出:Extra right brackets
    如果输入的左括号多余, 输出:Extra left brackets
    如果输入的括号不匹配,输出:Brackets not match
    如果输入的括号匹配,输出:Brackets match
    输入
    {{{{)))
    输出
    Brackets not match
    样例输入
    {([)]}
    样例输出
    Brackets not match


    此题若借助STL很容易过,但是既然学习的是数据结构还是全部通过最基础的链表实现一下。而且此题好像单借助数组也可实现,记不太清了。之前做过。
    #include<bits/stdc++.h>
    using namespace std;
    template <class T>
    struct Node
    {
        T data;
        Node<T> *next;
    };
    template<class T>///定义栈
    class LinkStack
    {
    private:
        Node<T> *top;
    public:
        LinkStack(){top=NULL;}
        ~LinkStack();
        void Push(T x);
        void Pop();
        T Get_Top();
        int Empty(){if(top==NULL) return 1;return 0;}
    
    };
    
    /*      析构函数      */
    template<class T>
    LinkStack<T>::~LinkStack()
    {
        while(top)
        {
             Node<T> *p;
             p=top;
             top=top->next;
             delete p;
        }
    
    }
    /*      入栈      */
    template<class T>
    void LinkStack<T>::Push(T x)
    {
        Node<T> *s;
        s=new Node<T>;
        s->data=x;
        s->next=top;
        top=s;
    }
    /*      删除         */
    template<class T>
    void LinkStack<T>::Pop()///注意此处的pop删除有返回值,而STL里面没有,此题不需要可忽略
    {
        if(top==NULL) throw "下溢";
        T x=top->data;
        Node<T> *p;
        p=top;
        top=top->next;
        delete p;
        return ;  //return x;
    }
    /*     出栈       */
    template<class T>
    T LinkStack<T>::Get_Top()
    {
        if(top==NULL) throw "栈空";
        return top->data;
    }
    char str[1000];
    void match(LinkStack<char>&s,char str[])
    {
        char e;
        for(int i=0;str[i]!=NULL;i++)
        {
          switch(str[i])
          {
            case '(':
            case '[':
            case '{':
                     s.Push(str[i]);
                     break;
            case ')':
            case ']':
            case '}':
                if(s.Empty()){
                    printf("Extra right brackets
    ");
                    return ;
                }
                else
                e=s.Get_Top();
                if(e=='('&&str[i]==')'||e=='['&&str[i]==']'||e=='{'&&str[i]=='}')
                {
                        s.Pop();
                        break;
                }
                else
                {
                    printf("Brackets not match
    ");
                    return ;
                }
    
          }
    
        }
        if(s.Empty())
        {
            printf("Brackets match
    ");
        }
        else
        {
            printf("Extra left brackets
    ");
        }
    }
    int main()
    {
        LinkStack<char> My_stack;
        cin>>str;
        match(My_stack,str);
        return 0;
    }


  • 相关阅读:
    Temporal Action Detection with Structured Segment Networks (ssn)【转】
    ubuntu多版本cuda并存与切换【两个博客链接】
    TURN TAP: Temporal Unit Regression Network for Temporal Action Proposals(ICCV2017)
    CTAP: Complementary Temporal Action Proposal Generation (ECCV2018)
    很实用的HTML5+CSS3注册登录窗体切换效果
    基于js的网页换肤(不需要刷新整个页面,只需替换css文件)
    CSS重置 reset.css
    CSS3制作分步注册表单
    CSS3 3D立体柜子实现
    创建 CSS3 下拉菜单
  • 原文地址:https://www.cnblogs.com/dean-SunPeishuai/p/10572298.html
Copyright © 2020-2023  润新知