7.18线性结构选讲部分代码

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int sta[1010],top;

int main()
{
    int n,x,y;cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        if(x==1) cin>>y,sta[++top]=y;
        else top--;
    }
    if(top==0)cout<<"impossible!"<<endl;
    else cout<<sta[top]<<endl;
    return 0;
}

栈练习1

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int sta[1010],top;

int main()
{
    int n,x,y;cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        if(x==1) cin>>y,sta[++top]=y;
        else
        {
            if(top)top--;
            else
            {
                cout<<"impossible!"<<endl;
                return 0;
            }
        }
    }
    if(top==0)cout<<"impossible!"<<endl;
    else cout<<sta[top]<<endl;
    return 0;
}

栈练习2

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int sta[1010],top;

int main()
{
    int n,x,y;cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        if(x==1) cin>>y,sta[++top]=y;
        if(x==2) top--;
        if(x==3) cout<<sta[top]<<endl;
    }
    return 0;
}

栈练习3

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int n,top,k,p;
char mn;
int s[100001],a[100001];

int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>mn;
        if(mn==‘A‘) a[++p]=++k;
        if(mn==‘B‘&&top==5)
        {
            cout<<"No"<<endl;
            return 0;
        }
        if(mn==‘C‘&&top==0)
        {
            cout<<"No"<<endl;
            return 0;
        }
        else
        {
            if(mn==‘B‘) s[++top]=++k;
            if(mn==‘C‘) a[++p]=s[top--];
        }
    }
    cout<<"Yes"<<endl;
    for(int i=1; i<=p; i++)
        cout<<a[i]<<endl;
    return 0;
}

天使之城

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int n,top,k,p;
char mn;
int s[100001],a[100001];

int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>mn;
        if(mn==‘A‘) a[++p]=++k;
        if(mn==‘B‘&&top==5)
        {
            cout<<"No"<<endl;
            return 0;
        }
        if(mn==‘C‘&&top==0)
        {
            cout<<"No"<<endl;
            return 0;
        }
        else
        {
            if(mn==‘B‘) s[++top]=++k;
            if(mn==‘C‘) a[++p]=s[top--];
        }
    }
    cout<<"Yes"<<endl;
    for(int i=1; i<=p; i++)
        cout<<a[i]<<endl;
    return 0;
}

后缀表达式

#include <cstring>
#include <cstdio>
#include <iostream>

using namespace std;
int n,l,top;
char s[3000000],tack[50000];
bool checked;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        memset(s,0,sizeof(s));
        top=0;
        checked=false;
        scanf("%s",s);
        l=strlen(s);
        if(s[0]==‘]‘||s[0]==‘}‘||s[0]==‘)‘||s[0]==‘>‘)
        {
            printf("FALSE\n");
            continue;
        }
        for(int j=0;j<l;j++)
        {
            if(s[j]==‘(‘||s[j]==‘{‘||s[j]==‘[‘||s[j]==‘<‘)
            {
                top++;
                tack[top]=s[j];
            }
            if((s[j]==‘)‘&&tack[top]!=‘(‘)||(s[j]==‘]‘&&tack[top]!=‘[‘)||(s[j]==‘}‘&&tack[top]!=‘{‘)||(s[j]==‘>‘&&tack[top]!=‘<‘))
            {
            printf("FALSE\n");
            checked=true;
            break;
            }
            if((s[j]==‘)‘&&tack[top]==‘(‘)||(s[j]==‘]‘&&tack[top]==‘[‘)||(s[j]==‘}‘&&tack[top]==‘{‘)||(s[j]==‘>‘&&tack[top]==‘<‘))
                top-=1;

        }
        if(checked)
        continue;
        if(!top)
        printf("TRUE\n");
        else
        printf("FALSE\n");
    }
    return 0;
}

括号序列

#include<iostream>
using namespace std;
int q[1001],n,x[1001],y[1001],head,tail;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x[i];
        if(x[i]==1)
            {
                cin>>y[i];
                q[tail++]=y[i];
                continue;
            }
        if(x[i]==2)
            {
                if(head==tail){cout<<"impossible!";return 0;}
                else head++;continue;
            }
    }
    if(head==tail){cout<<"impossible!";return 0;}
    cout<<q[head];
}

队列练习1

#include<iostream>
using namespace std;
int q[100001],n,x[100001],y[100001],head,tail;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x[i];
        if(x[i]==1)
            {
                cin>>y[i];
                q[tail++]=y[i];
                continue;
            }
        if(x[i]==2)
            {
                if(head>=tail){cout<<"impossible!";return 0;}
                else head++;continue;
            }
    }
    if(head==tail){cout<<"impossible!";return 0;}
    cout<<q[head];
}

队列练习2

#include<iostream>
using namespace std;
int q[100001],n,x[100001],y[100001],head,tail;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x[i];
        if(x[i]==1)
            {
                cin>>y[i];
                q[tail++]=y[i];
                continue;
            }
        if(x[i]==2)
            {
                if(head>=tail){cout<<"impossible!";return 0;}
                else head++;continue;
            }
        if(x[i]==3)
        {
            cout<<q[head]<<endl;
        }
    }
    if(head==tail){cout<<"impossible!";return 0;}
}

队列练习3

#include<cstdio>

int m,n,q[1001],fro,end,x,tot;
bool b[1001];//判断是否出现

int main()
{
    scanf("%d%d",&m,&n);fro=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(b[x]) continue;
        if(end-fro+1==m) b[q[fro]]=0,fro++;
        q[++end]=x;tot++;b[x]=1;
    }
    printf("%d\n",tot);
    return 0;
}

机器翻译

#include<cstdio>
#include<iostream>
#include<cstring>

#define maxn 100005

int last,cur,next[maxn];
char s[maxn];

int main()
{
    while (scanf("%s",s+1)==1)
    {
        int n=strlen(s+1);
        last =cur=0;
        next[0]=0;
        for(int i=1;i<=n;i++)
        {
            char ch=s[i];
            if(ch==‘[‘) cur=0;
            else if (ch==‘]‘) cur =last;
            else
            {
                next[i]=next[cur];
                next[cur]=i;
                if(cur ==last) last=i;
                cur=i;
            }
        }
        for(int i=next [0];i!=0;i=next[i])
            printf("%c",s[i]);
        printf("\n");
    }
    return 0;
}

破损的键盘

#include<cstdio>
#include<cstring>

using namespace std;

#define MAXN 1000010
int left[MAXN],right[MAXN],n,i,a,f,m,first=1;

int main()
{
    memset(left,-1,sizeof(left));
    memset(right,-1,sizeof(right));
    left[1]=right[1]=0;
    left[0]=right[0]=1;
    scanf("%d",&n);
    for(i=2;i<=n;i++)
    {
        scanf("%d%d",&a,&f);
        if(!f)
        {
            right[left[a]]=i;
            left[i]=left[a];
            left[a]=i;
            right[i]=a;
        }
        else
        {
            left[right[a]]=i;
            right[i]=right[a];
            right[a]=i;
            left[i]=a;
        }
    }
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&f);
        if(left[f]<0)continue;
        right[left[f]]=right[f];
        left[right[f]]=left[f];
        left[f]=right[f]=-1;
    }
    i=0;
    for(;;)
    {
        if(!right[i]){putchar(‘\n‘);return 0;}
        if(first){printf("%d",right[i]);first=0;}
        else printf(" %d",right[i]);
        i=right[i];
    }
}

队列安排

时间: 2024-11-05 16:41:56

7.18线性结构选讲部分代码的相关文章

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个

常见的线性结构

目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现"括号匹配"问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言 ??本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间

查找算法--线性结构的查找方法

查找基本概念: 查找又称为检索,指从一批记录中找出满足指定条件的某一记录过程.在日常生活中比如通讯录查找,字典查找等经常使用查找方法:在程序设计中,查找在许多程序中需要占用很多时间,因此,一个好的查找方法可以提高程序的运行速度. 主关键字和次关键字: 在需要查找的数据结构中,每条记录一般包含多个数据域.查找条件一般是给定其中的一个或几个域的值,这些作为查找条件的域成为关键字(KEY),如果关键字可以唯一标示数据结构中的一条记录,则称此关键字(Primary Key):若关键字不能唯一区别各个不同

poj 3666 Making the Grade (线性结构上的DP )

题意: 给定n个数,问你将他们修改成非增或非减序列的最小花费.最小花费的定义是 假设原数组为 a[1] a[2] a[3] .... a[n] 修改后数组为 b[1] b[2] b[3] .... b[n] 那么最小花费为|a[1]-b[1]|+|a[2]-b[2]|+| a[3] - b[3] |+.....| a[n] - b[n] |. 思路: 线性结构上的动态规划 定义状态d[i][j] 表示 前i-1个数字已经是最小花费 现在把第i个数修改成b[j] 修改完成后前i个数总共最少需要的花

【Python】09、线性结构与切片

一.线性结构 list.tuple.str.bytes.bytearray,range() 都是顺序存储.顺序访问的.都是可迭代对象.都可以通过索引访问:被称为线性结构 可使用len()获取长度.可以切片,可以使用iter()将可迭代对象转换为迭代器 In [16]: r = range(8) In [17]: r Out[17]: range(0, 8) In [18]: i = iter(range(8)) In [19]: i Out[19]: <range_iterator at 0x7

Mooc数据结构-基础和线性结构

1 数据结构 解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的操作相关联 完成这些操作所用的方法就是算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象: 描述数据类型的方法不依赖与具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言无关

[2014.5.18][SuperPixel] 也看Greg.Mori.代码的配置与执行

SuperPixel最初由Xiaofeng Ren提出(ICCV 2003),但我在网络上尚未找到有关这个最初想法的源代码:比较容易获得的倒是Greg Mori(CVPR 2004,ICCV 2005)基于Xiaofeng Ren算法做的代码https://www.cs.sfu.ca/~mori/research/superpixels/.代码包分为32bit版和64bit版. 这个代码用到了C与M混合编程,并非是拿来即可运行的,在代码和matlab的配置上还是有一定需要注意的问题. 搜索了下,

一步一步写算法(之线性结构的处理)

原文:一步一步写算法(之线性结构的处理) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 我们知道,在内存中的空间都是连续的.也就是说,0x00000001下面的地址必然是0x00000002.所以,空间上是不会出现地址的突变的.那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆.数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理.所以从这个意义上说,掌握了数组才能说明你数据结构入门了. 那么,

简单JS全选、反选代码

1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2<html xmlns="http://www.w3.org/1999/xhtml"> 3<head> 4<meta http-equiv="Cont