数据结构:栈

有很多题都有对栈的考察,这里引出一个最最基础的模型,其他复杂的问题可以在这个模型的基础之上完成

与其说是模型,不如说是给了一种解决问题的套路

至于元素顺序入栈之后,出栈结果的统计问题,这里可以参考卡特兰数的应用,后面会用到

这里的例题是这样的,给定一个括号字符串,判断该字符串是否合法

由于括号字符串是栈有序的(姑且这么叫),那么我们就可以用一个栈来处理它

此问题可进一步拓展为表达式求值问题以及判断出栈合法性问题(本题就是一个最简单的判断出栈合法性的问题)

首先我们枚举字符串中的每一个字符

进行判断:

        if(s[i]=='('||s[i]=='['||s[i]=='{')
            t.push(s[i]);

如果是左括号直接入栈

else if(s[i]==')'||s[i]==']'||s[i]=='}')
        {
            if(t.empty())
            {
                flag=0;
                break;
            }
            char tmp=t.top();
            t.pop();
            if(s[i]==')'&&tmp!='('||s[i]==']'&&tmp!='['||s[i]=='}'&&tmp!='{')
            {
                flag=0;
                break;
            }
        }

如果是右括号,分情况

如果此时栈空,说明没有与之匹配的左括号,错误

如果括号不匹配,错误

    if(!t.empty()) 
        flag=0;

最后,如果栈非空,说明有的左括号没有与之对应的右括号了,错误

下面给出完整的实现:

 1 #include<iostream>
 2 #include<stack>
 3 using namespace std;
 4 string s;
 5 stack<char> t;
 6 int main()
 7 {
 8     cin>>s;
 9     bool flag=true;
10     int len=s.length();
11     for(int i=0;i<len;i++)
12     {
13         if(s[i]=='('||s[i]=='['||s[i]=='{')
14             t.push(s[i]);
15         else if(s[i]==')'||s[i]==']'||s[i]=='}')
16         {
17             if(t.empty())
18             {
19                 flag=0;
20                 break;
21             }
22             char tmp=t.top();
23             t.pop();
24             if(s[i]==')'&&tmp!='('||s[i]==']'&&tmp!='['||s[i]=='}'&&tmp!='{')
25             {
26                 flag=0;
27                 break;
28             }
29         }
30     }
31     if(!t.empty()) 
32         flag=0;
33     cout<<flag;
34     return 0;
35 }

 

posted @ 2018-07-17 16:32  静听风吟。  阅读(318)  评论(0编辑  收藏  举报