基础数据结构-堆栈-拓展:括号匹配

这是一个考察对堆栈概念理解的应用,输入一串带括号的式子,检查其中的括号是否前后对应。思路是当遇到括号是入栈,并在下次遇到括号时检测是否与上一个入栈的括号匹配为一对,不是则继续入栈。因为正确的式子最终总能遇到一个匹配的括号。例如:{3+a+[1+b+c*(1+2)]+3},可以最先检测出()这一对小括号,然后出栈,下一个待匹配括号[与]也可成功匹配。

#include<iostream> 
#include<stack>
#include <string>

using namespace std;

int main()
{ 
    string str;
    int len,num;
    cin >> num;
    for(int j=1;j<=num;j++)
    {
        int error=0;
        cin>> str;
          len=str.length();
        stack<char> s;
        for(int i=1;i<=len;i++)
        {
            if(str[i-1]=='('||str[i-1]=='['||str[i-1]=='{')
            {
                s.push(str[i-1]);
            }
            switch(str[i-1])
            {
                case ')':
                if(s.empty())
                {
                    error = 1;
                }
                else
                {
                    if(s.top()=='(')
                    {
                        s.pop();
                    }
                    else
                    {
                        error = 1;
                    }    
                }
                break;

                case ']':
                if(s.empty())
                {
                    error = 1;
                }
                else
                {
                    if(s.top()=='[')
                    {
                        s.pop();
                    }
                    else
                    {
                        error = 1;
                    }
                }
                break;

                case '}':
                if(s.empty())
                {
                    error = 1;
                }
                else
                {
                    if(s.top()=='{')
                    {
                        s.pop();
                    }
                    else
                    {
                        error = 1;
                    }
                }
                break;
            }
        } 
        if((s.empty())&&(error!=1))
        {
            cout<<"ok"<<endl;
        }
        else
        {
            cout<<"error"<<endl;
        }
    }
    return 0;
}

 

posted @ 2017-03-02 16:54  Nathaneko  阅读(342)  评论(0编辑  收藏  举报