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 }

 

转载于:https://www.cnblogs.com/OFSHK/p/11296085.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值