zoukankan      html  css  js  c++  java
  • 《算法实战策略》-chaper19-队列、栈和双端队列

      对于计算机专业的学生来说,他们一定会很熟悉一句话:程序设计 = 算法 + 数据结构。而根据笔者的理解,所谓程序设计其实就是为了编程解决实际问题,所谓算法是一种解决问题某种思维的方法,但是思维需要得到编程实践,这就需要基于数据结构。一个好的数据结构能够让我们更快更高效得处理数据,有些模拟性、数学背景并不深厚的的问题,仅仅基于高效的数据结构就可以解决。那么这一章节,我们就单独将队列、栈、双端队列拿出来,结合具体的题目,看看它们是如何灵活的运用到解题策略当中的。

      考虑到笔者在《入门经典》和《啊哈算法》中对几种简单的线性结构已经有所介绍,这里便不再赘述其概念和STL的用法。主要通过具体的题目来进行提高运用的能力。

      不匹配括号问题:

      小括号:().

      中括号:[]

      大括号:{}

      现在给出一个由三种括号组成字符串,请编程判断三种括号是否匹配。

      示例输入值:

      3

      ()()

      ({[}])

      ({}[(){}])

      示例输出值:

      YES

      NO

      YES

       分析:如果进行模拟,过程会变得非常麻烦而且非常不好设计。但是如果我们基于栈的数据结构,会发现会使问题变得异常简便。因为括号匹配的法则和栈“后入先出”的特点刚好吻合。我们只需要将所有的左括号依次入栈,一旦遇到右括号,我们将之与栈顶元素进行匹配,如果匹配,栈顶元素出栈,否则,完成判断。

      简单的参考代码如下。

    bool wellMatched(const string& formula)
    {
        const string opening("({["),closing(")}]");
    
        stack<char> openStack;
        for(int i = 0;i < formula.size();++i)
        {
              if(opening.find(formula[i]) != -1)
                 openStack.push(formula[i]);//左括号,压栈
              else//右括号,进行匹配
              {
                  if(openStack.empty())  return false;//此时栈空,匹配失败
                  if(opening.find(openStack.top()) != closing.find(formula[i])) return false;//不匹配
    
                  openStack.pop();//弹出栈顶元素
              }
    
            return openStack.empty();//遍历字符串所有字符,如果栈空,匹配成功
        }
    }
  • 相关阅读:
    SQL Server 索引基本概念与优化
    将Heap RID转换成RID格式
    有关DeadLock的文章列表
    sql报字段过大的错误解决方法
    查询当天数据(mysql)
    cookie和session的区别
    get和post的区别
    jq点击切换按钮最简洁代码
    js提示确认删除吗
    thinkphp解决分页后序列号自增的问题
  • 原文地址:https://www.cnblogs.com/rhythmic/p/5613844.html
Copyright © 2011-2022 走看看