《入门经典》——6.21

数据结构基础:

所谓数据结构即整合繁杂数据使之变得排列井然有序的结构,我们最为熟悉的数组,其实就是一种数据结构,它本质上是一种线性表,即“所有的元素排成一行”,同为线性表的数据结构还有队列、栈、链表等,通常在处理一些环状结构的时候,我们从任意一点截断,便可将其转化为线性表。

队列:

卡片游戏:桌上有一叠拍,从第一张牌(即位于顶面的牌)开始从上往下一次编号为1~n。当至少还剩两张牌时进行如下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后。输入n,输出每次扔掉的牌,以及最后剩下的牌。

样例输入:7.

样例输出:1 3 5 7 4 2 6

分析:观察这个过程,它非常像一个长长的队伍,队首的人走了,然后队首的人又来到了队尾……其实我们在《啊哈算法》一书的笔记专栏中介绍了这两种线性结构,它们都可以基于c和指针来完成模拟实现,这里主要介绍更为常见的c++中STL(标准模板库)的实现。

具体用法如下:

 #include<cstdio>

#include<queue>

using namespace std;

queue<int> q;//队列操作0,定义。

int main()

{

    int n;

    scanf("%d",&n);

    for(int i = 1;i <= n;i++)  q.push(i);//队列操作1,向队尾添加元素

    while( !q.empty() )  //队列操作2,判断队列是否为空

    {

        printf("%d ",q.front()); //队列操作3,返回队列首元素

        q.pop();                //队列操作4,抛弃队列首元素

        q.push(q.front());

        q.pop();

    }

    return 0;

}

栈:

Ex2:

某城市有一个火车站,如图。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择:A->C和C->B.

分析:可以说火车轨道问题是生活中非常贴合栈这个数据模型的了,栈还可以看成这样一个具体例子:存羽毛球或者存乒乓球的盒子、存薯片的圆柱体包装,我们都不难概括出栈的一条性质,先进栈的后出栈。

回到这个问题,中转站C就是一个奠定的栈模型。下面我们开始模拟判断方案过程。

我们用两个变量A、B来分别表示模拟过程中A、B站这在进行匹配的下标。同时A还有表示标号的作用。

它的匹配模拟过程如下。

先判断A站中的头元素是否等于B站当前正在匹配的元素,如果相同,我们将这个元素入栈然后再出栈即可,两个位置变量A、B均加1.

如果不相等,先不要着急将A站的头元素压入栈,应该先判断栈顶元素是否能够和B站正在匹配的元素相匹配,如果匹配,则弹出栈顶元素。

经过如上的两个判断,在进行压栈操作。

如果前三个步骤都没有进行,说明现在A站已经空了,栈没有空但是却无法进行匹配,表明不存在何时的排列方案。

简单的参考代码如下。

  #include<cstdio>

#include<stack>

using namespace std;

const int maxn = 1000 + 5;

int n , target[maxn];

int main()

{

    while(scanf("%d",&n) != EOF)

    {

        stack<int> s;

           for(int i = 1;i <= n;i++)

              scanf("%d",&target[i]);

        int A,B;

        A = B = 1;

        int ok = 1;

        while(B <= n)

        {

               if (A == target[B]) {A++ , B++;}

               else if(!s.empty() && s.top() == target[B]){s.pop() , B++;}

               else if(A <= n)  {s.push(A++);}

               else  {ok = 0 ; break;}

        }

        printf("%s\n",ok ? "Yes" : "No");

    }

}
时间: 2024-11-01 13:47:46

《入门经典》——6.21的相关文章

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

2016/5/21学习记录

1.重大教训!先上代码 1 package Pra; 2 3 public class Read { 4 5 public static void main(String[] args) { 6 T a = new T(); 7 Read.swap(a); 8 System.out.println("e1 = "+a.e1+"e2 = "+a.e2); 9 } 10 public static void swap(T t){ 11 int temp = t.e1;

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

Java程序最容易犯的21种错误

1.Duplicated Code 代码重复几乎是最常见的异味了.他也是Refactoring的主要目标之一.代码重复往往来自于copy-and-paste的编程风格.与他相对应OAOO是一个好系统的重要标志. 2.Long method 它是传统结构化的"遗毒".一个方法应当具有自我独立的意图,不要把几个意图放在一起. 3.Large Class 大类就是你把太多的责任交给了一个类.这里的规则是One Class One Responsibility. 4.Divergent Cha

android studio :com.android.support:appcompat-v7:21.+ 报错

android studio :com.android.support:appcompat-v7:21.+ 报错: 在project——>app——>build.gradle修改: apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.example.ri

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

21 Guns -- Green Day

21 Guns Green Day (绿日乐队)的代表曲之一.歌曲的主题是反战,同时安慰了曾 经信任布什政府如今失望透顶的美国民众.这首歌也被电影<变形金刚2> 当作插曲. Do you know what's worth fighting for When it's not worth dying for? Does it take your breath away And you feel yourself suffocating1?Does the pain weigh out the

普林斯顿公开课 算法2-1:排序概述

目标 对所有类型的数据进行排序. 问题 排序函数如何知道比较的是哪种类型的数据呢? 回调函数 这时候就需要引入回调函数的概念了.回调函数就是将可执行的代码作为参数进行传递. 实现回调的方法 在Java中可以通过接口来实现,在C语言中可以通过函数指针来实现,C++中可以通过class-type functor,也就是重载操作符operator ()的类,在C#中可以使用Delegate委托,在Python/Perl/ML/javascript中可以直接传递函数. JDK中提供了Comparable

Java学习作业(14.4.21)

前三次作业都是基础语法.真的好水啊.从这次开始记录. 1.编写Java程序,把当前目录下扩展名为txt的文件的扩展名全部更名为back. 1 import java.io.*; 2 import java.lang.*; 3 4 5 public class Home { 6 7 public void reName(String path, String from, String to) { 8 File f = new File(path); //声明File对象,用于导入修改路径 9 Fi

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27