AYITOJ-括号序列-栈的入门
题目描述
给定一个由括号组成的字符串
问其是否为一个合法的括号序列
合法的括号序列的定义如下
1. 空字符串是合法的括号序列
2. 若字符串A是合法的括号序列, 那么{A},[A],(A)也是合法的括号序列
3. 若字符串A,B是合法的括号序列, AB也是合法的括号序列
例如 {} ,[] , ({}()[]) 是合法的括号序列, ({)}则不是
输入格式:
一行, 一个仅含括号(){}[]的字符串
输出格式:
一行, "YES"表示字符串是合法的括号序列, 否则输出"NO"
样例输入1:
({}()[])
样例输出1:
YES
样例输入2:
({)}
样例输出2:
NO
数据范围
保证 |s|<=105|s|<=105
子任务1:(10分)
保证 |s|<=10|s|<=10
子任务2:(10分)
保证 |s|<=103|s|<=103
子任务3:(20分)
题意:第一次做的时候运行正确,但是提交错误,搞了半天是自己题意理解有问题。正确的题意:有三种括号{}、[]、(),每一个括号内部要有其他的完整的括号(括号数量>=0)即可,但是必须是完整的。完整的输出YES,否则输出NO。
思路:一种方法是可以用for循环模拟一遍,另外一种更直观也更好理解,就是用栈写,因为栈的特点就是后进先出。具体操作见代码的注释。
栈的基本操作:和队列进行对比,栈是一个后进先出的线性表,插入和删除元素只能在表的一端进行。
栈顶:插入元素的一端。
栈底:插入元素的另一端。
入栈:插入元素(push)。
出栈:删除元素(op)。
头文件:#include<stack>
其他操作见如下代码注释:
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<map> 5 #include<stack>//头文件 6 using namespace std; 7 8 stack<char>s;//首先需要像队列一样进行声明 9 int main() 10 { 11 string ss; 12 ss.erase(); 13 cin>>ss; 14 for(int i=0; i<ss.length(); i++) 15 { 16 if(s.empty())//如果栈为空,则插入元素,即将元素入栈。栈为空返回为真 17 s.push(ss[i]);//入栈操作push() 18 else if(s.top()=='(')//访问栈顶元素top(),即整个栈最上面的元素,看成线性的话,则是最右边的元素,去进行匹配 19 { 20 if(ss[i]==')')//如果正好可以和当前for循环走到的元素进行匹配的话,则删除栈顶元素 21 s.pop();//删除栈顶元素,也就是出栈,出栈操作pop() 22 else 23 s.push(ss[i]); 24 } 25 else if(s.top()=='[') 26 { 27 if(ss[i]==']') 28 s.pop(); 29 else 30 s.push(ss[i]); 31 } 32 else if(s.top()=='{') 33 { 34 if(ss[i]=='}') 35 s.pop(); 36 else 37 s.push(ss[i]); 38 } 39 else 40 s.push(ss[i]); 41 } 42 if(s.empty())//如果为空则返回为真,输出YES 43 cout<<"YES"<<endl; 44 else 45 cout<<"NO"<<endl; 46 return 0; 47 }