zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    老陌与博客
    有关模式窗体和无(非)模式窗体的区别
    10月9日至10月22日备忘录
    9月4日至9月10日备忘录
    VS2015 远程调试:Remote Debugger
    8月28日至9月3日备忘录
    8月21日至8月27日技术积累
    用函数方法实现迭代器
    python中eval, exec, execfile,和compile(转载)
    dev 中的GridControl中的行实现选择的功能实现
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11296085.html
Copyright © 2011-2022 走看看