sean

厚积薄发,坚持到最后一分钟。

括号匹配

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

输入一串括号
如果输入的右括号多余,输出: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\n");
                return ;
            }
            else
            e=s.Get_Top();
            if(e=='('&&str[i]==')'||e=='['&&str[i]==']'||e=='{'&&str[i]=='}')
            {
                    s.Pop();
                    break;
            }
            else
            {
                printf("Brackets not match\n");
                return ;
            }

      }

    }
    if(s.Empty())
    {
        printf("Brackets match\n");
    }
    else
    {
        printf("Extra left brackets\n");
    }
}
int main()
{
    LinkStack<char> My_stack;
    cin>>str;
    match(My_stack,str);
    return 0;
}

 



posted on 2019-03-21 16:02  Sean521  阅读(332)  评论(0编辑  收藏  举报

导航