有很多题都有对栈的考察,这里引出一个最最基础的模型,其他复杂的问题可以在这个模型的基础之上完成
与其说是模型,不如说是给了一种解决问题的套路
至于元素顺序入栈之后,出栈结果的统计问题,这里可以参考卡特兰数的应用,后面会用到
这里的例题是这样的,给定一个括号字符串,判断该字符串是否合法
由于括号字符串是栈有序的(姑且这么叫),那么我们就可以用一个栈来处理它
此问题可进一步拓展为表达式求值问题以及判断出栈合法性问题(本题就是一个最简单的判断出栈合法性的问题)
首先我们枚举字符串中的每一个字符
进行判断:
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 }