基础算法(二)——队列

队列(queue)在计算机科学中,是一种先进先出的线性表。它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

——来自360百科

队列的储存:(大体的结构可以用数组或者链表来实现)一般有两个指针,允许插入的一端焦作队尾(rear),允许删除的一端叫作队头(head),如图1-2所示:


图1-2

队列设置的一种参考程序(部分):

var

Head,tail:longint;
  Doute:array[1..100000]of longint;
Begin

head:=x;

tail:=y;

read……;

...

End.

对于队列,一般有如下的操作:

1. 入队

2. 出队

3. 判断队列是否为空

【参考模板】

(1)初始化

Procedure c1;

begin

  head:=0;

  tail:=0;

end;

(2)入队

Procedure c2(x:nultype);

begin

  inc(tail);

  doute[tail]:=x;

end;

(3)出队

Procedure c3;

begin

  inc(head);

end;

在操作的时候,两个指针要随时观察、移动。

【重点】假溢出:读图1-3理解何为假溢出:

先介绍一下循环队列:将普通的队列的首位相连,即可以叫做循环队列,如图1-4

观察图1-5,1-6后理解:如何应对假溢出?

一般的,对付这种情况有如下的方法:

1)采用循环队列;
2)按最大可能的进队操作次数设置顺序队列的最大元素个数;
3)修改出队算法,使每次出队列后都把队列中剩余数据元素向队头方向移动一个位置;
4)修改入队算法,增加判断条件,当假溢出时,把队列中的数据元素向对头移动,然后方完成入队操作。

【例】细胞(cell.pas/c/cpp)

【问题描述】一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:阵列

0234500067

1034560500

2045600671

0000000089

中有4个细胞。

【输入】 输入共m+1行 (1<=m<=100, (1<=n<=100)第一行有两个数据,分别表示总行数和总列数以下的m行,每行有n个0-9之间的数

【输出】细胞个数

【样例】

Input:

4  10
0234500067
1034560500
2045600671
0000000089

Output:

4

【参考程序】

const
dx:array[1..4]of longint=(0,-1,0,1);
dy:array[1..4]of longint=(1,0,-1,0);
var
n,m,i,j,tj:longint;
a:array[-10..100,-10..100]of boolean;
x:char;
state:array[0..4000,0..4000]of longint;

procedure bfs(x,y:longint);
var
head,tail,i:longint;
begin
    inc(tj);
    a[x,y]:=false;
    head:=0;tail:=1;
    state[1,1]:=x;state[1,2]:=y;
    repeat
         inc(head);
         for i:=1 to 4 do
         begin
             x:=state[head,1]+dx[i];
             y:=state[head,2]+dy[i];
             if (x>0)and(x<=m)and(y>0)and(y<=n)and(a[x,y]=true) then
             begin
                 inc(tail);
                 state[tail,1]:=x;
                 state[tail,2]:=y;
                 a[x,y]:=false;
             end;
         end;
    until head>=tail;
end;

begin
    readln(m,n);
    fillchar(a,sizeof(a),true);
    for i:=1 to m do
    begin
        for j:=1 to n do
        begin
            read(x);
            if x=‘0‘ then a[i,j]:=false;
        end;
        readln;
    end;
    for i:=1 to m do
    for j:=1 to n do
    if a[i,j]=true then bfs(i,j);
    write(tj);
end.

// (该程序由网上搜集,要用到BFS,找到一个细胞后就进行BFS操作即可)

时间: 2024-10-22 15:08:37

基础算法(二)——队列的相关文章

基础算法之二——枚举法

基础算法之二--枚举法"赛利的硬币" 题目描述 赛利有 12枚银币.其中有 11枚真币和1枚假币.假币看起来和真币没有区别,但是重量不同.但赛利不知道假币比真币轻还是重.于是他向朋友借了一架天平.朋友希望赛利称三次就能找出假币并且确定假币是轻是重.例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的.如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币.经过精心安排每次的称量,赛利保证在称三次后确定假币. 输入数据 输入有三行,每行表示一次称量的结果.赛利事先

数据结构与算法二

1.课程安排表: 1. 线性表 2. 字符串 3. 栈和队列 4.树 5.查找 6.排序 7.暴力枚举法 8.广度优先搜索 9.深度优先搜索 10.分治 11.贪心 12.动态规划 13.图 14.数学方法与常见模型 15.大整数运算 16. 基础功能 2.   编程技巧: 1.把较大的数组放在main 函数(全局变量)外,作为全局变量,这样可以防止栈溢出,因为栈的大小是有限制的.GCC (C编译器) 段错误 2.如果能够预估栈,队列的上限,则不要用stack,queue,使用数组来模拟,这样速

有动态示意图!程序员必须知道的10大基础算法讲解

目录: 算法一:快速排序算法 算法二:堆排序算法 算法三:归并排序 算法四:二分查找算法 算法五:BFPRT(线性查找算法) 算法六:DFS(深度优先搜索) 算法七:BFS(广度优先搜索) 算法八:Dijkstra算法 算法九:动态规划算法 算法十:朴素贝叶斯分类算法 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的

JMS基础篇(二)

简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必等到接收者接收或者处理消息,可以接着做后续的处理. 应用程序发送消息至另外一个应用程序,需要使用到消息中间件.消息中间件应提供容错,负载均衡,可伸缩的事务性等特性. JMS与JDBC类似,是一种与厂商无关的API.应用程序开发者可以使用同样的API来访问不同的系统. 可以认为JMS是一种标准,各消息

数字视频基础(二)

2.    常用数字视频标准 2.1 BT656 首先要理解模拟PAL/NTSC的视频信号的波形: 要进行视频的数字传输,首先我们要将模拟视频信号数字化,获得每个像素的YUV值,一般采用YUV422格式,仅仅传输图像数据还不行,还要传输行同步.场同步.奇偶场信号.以及每行图像什么时候开始的,什么时候结束的.这样在接收端才能正确接收和理解数据,并获得视频的重现. SAV(有效视频开始)和EAV(有效视频结束)码,反映了模拟视频的同步信号.由前导符FF.00.00开始,这三个字节的前导符在视频数据中

Linux安全与加密基础(二)

Linux安全与加密基础(二) 常见的加密算法 SSL: Openssl与CA认证 ssh服务 dropbear AIDE sudo gpg gpg亦可用于对称加密与文件检验. 文件完整性的两种实施方式 被安装的文件     MD5单向散列     rpm --verify package_name (or -V) 发行的软件包文件     GPG公钥签名     rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*     rpm --checks

Kruskal算法(二)之 C++详解

本章是克鲁斯卡尔算法的C++实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的