算法原理与实践(栈与队列)

  Stack & Queue

  大纲

  1. Stack介绍
  2. Queue介绍
  3. 例题分析

  Stack
  A stack is a container of objects that are inserted and removed according to the last-in first-out (LIFO) principle
  Operations: Push O(1), Pop O(1), Top O(1)

  栈的用途
  可以用 Stack 作为辅助,实现深度优先算法(Depth first search, DFS),或者将递归转为while循环
  递归本身就是相当于把函数本身一层一层加到操作系统的内存栈上;入栈操作相当于递归调用自身,出栈操作相当于递归返回。

  工具箱:C++
  stack and queue:

bool empty() const; // Returns whether the stack is empty: i.e. whether its size is zero.
void push (const value_type& val); // Inserts a new element at the top of the stack. The content of this new element is initialized to a copy of val.
void pop(); // Removes the element on top of the stack, effectively reducing its size by one.
value_type& top(); // Returns a reference to the top element in the stack

  Example:

stack<int> myStack;
myStack.push(10);
myStack.push(20);
int value = myStack.top(); // value equals to 20
queue<int> myQueue;
myQueue.push(10);
myQueue.push(20); // queue now has two elements, the value of which is 10, 20
int value = myQueue.front(); // value equals to 10
myQueue.pop(); // queue now has one element, the value of which is 20

  

  Queue
  A queue is a container of objects (a linear collection) that are inserted and removed according to the first-in first-out (FIFO) principle
Operations: O(1) Push,O(1) Pop,O(1) Top
  Always used for BFS

  用途
  我们可以用 Queue 作为辅助,实现广度优先算法(Breadth first search, BFS)
  Queue 还可以作为 buffer,构建一个生产者-消费者模型:生产者把新的元素加到队尾,消费者从队头读取元素。在有两个线程同时读取同一个 queue 时,需要考虑同步(synchronization)
  stack 与 queue 可以视作封装好的 Linked list,只是限制了访问和插入的自由。适用 stack 或 queue 的情境,也可以考虑使用更为强大的list。

  模式识别
  1. 通过stack实现特殊顺序的读取由于 stack 具有 LIFO 的特性,如需实现任何特定顺序的读取操作,往往可以借助两个 stack 互相”倾倒"来实现特定顺序。另一个stack作为辅助。

  Get Max Stack
  Implement a stack, enable O(1) Push, Pop Top, Max. Where Max() will return the value of maximum number in the stack.

  解答
  Using two stacks.
  The first one is the regular stack. The second one only store maximum numbers if a larger number comes.
  复杂度分析:时间复杂度符合题目要求为 O(1)。空间复杂度最坏情况附加的 stack 中需要储存每个元素,故额外使用O(n)空间。

时间: 2024-10-06 03:48:46

算法原理与实践(栈与队列)的相关文章

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

数据挖掘系列(8)朴素贝叶斯分类算法原理与实践

隔了很久没有写数据挖掘系列的文章了,今天介绍一下朴素贝叶斯分类算法,讲一下基本原理,再以文本分类实践. 一个简单的例子 朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下: 这个公式虽然看上去简单,但它却能总结历史,预知未来.公式的右边是总结历史,公式的左边是预知未来,如果把Y看出类别,X看出特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来. 举个例子,大学的时候,某男生经常去图

GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一)

GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一) 算法入门和编程风格 从一道入门题谈起 /*StrStr Returns the position of the first occurrence of string get in string source, or -1 if target is not part not of source. */ 另一篇博客:http://blog.csdn.net/lionpku/article/details/46713877 StrS

【万字总结】图解堆算法、链表、栈与队列(多图预警)

转自:http://blog.csdn.net/nomasp/article/details/50349172 堆算法 什么是堆 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构. 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树,二叉堆满足堆特性:父

数据结构与算法系列研究二——栈和队列

栈和队列的相关问题分析 一.栈和队列定义 栈和队列是两种重要的数据结构.从结构特性角度看,栈和队列也是线性表,其特殊性在于它们的基本操作是线性表的子集,是操作受限的线性表,可称为限定性的数据结构:从数据类型角度看,其操作规则与线性表大不相同,是完全不同于线性表的抽象数据类型.                    图1 栈的结构                                                 图2 队列的结构   1.1.栈是限定在表的一端进行插入和删除操作的线性

kmeans算法原理以及实践操作

kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点. 算法原理: (1) 随机选取k个中心点: (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为该类: (3) 更新中心点为每类的均值: (4) j<-j+1 ,重复(2)(3)迭代更新,直至误差小到某个值或者到达一定的迭代步数,误差不变. 空间复杂度o(N) 时间复杂度o(I*K*N) 其中N为样本点个数,K为中心点个数,I为迭代次数 为什么迭代后误差逐渐减小: SSE=  对于 而言,求导

【转载】浅谈算法和数据结构: 一 栈和队列

作者:yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 最近晚上在家里看Algorithms,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开

浅谈算法和数据结构: 一 栈和队列

最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且"图码并茂",趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算机程序离不开算法和数据结构,本文简单介绍栈(Stack)和队列(Queue)的实现,.NET中与之相关的数据结构,典型应用等,希望能加深自己对这

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一