这个题我一开始是这么想的。。

爆搜所有可能的出栈序列

然后对输入进行匹配

这样我感觉太慢

然后我们可以想到直接通过入栈序列对出栈序列进行匹配

但是我犯了一个错误。。那就是出栈序列一定到入栈序列里找。。

找不到的入栈,最后弹栈,弹不空的就是不合法序列

但是这里有一个逻辑不对。。为什么最后才弹栈呢。。为什么中间不能从非空栈中弹栈呢

所以,出栈序列要么和入栈序列匹配要么和已经入栈的栈顶匹配,要么安排入栈序列元素入栈,

如果入栈序列和入栈的栈顶都无法匹配且入栈序列无法入栈,那么匹配出错

对于5 12324 24321虽然可以合法出栈。。但是这题并不care

如果有这种多个相同编号的情况,我们需要dfs一下所有入栈和出栈的情况

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//================= Stack ==================================
#define __init_size 1000
typedef struct{
int size,__size,head,tail,*seq;
}Stack; typedef Stack* S_P;
void __init(S_P s){
s->head=s->tail=s->size=0;
s->__size=__init_size;s->seq=(int*)malloc(__init_size*sizeof(Stack));//少了__init_size
}
int __empty(S_P s){
if(s->head==s->tail) return 1;
return 0;
}
void __push(S_P s,int ele){
if(s->tail+1>=s->__size){
s->seq=(int*)realloc(s->seq,sizeof(Stack)*(s->__size+=__init_size));
}
s->seq[s->tail++]=ele;s->size++;
}
void __pop(S_P s){
if(!__empty(s)) s->tail--,s->size--;
}
int __top(S_P s){
if(!__empty(s)) return s->seq[s->tail-1];
}
void __test(){
S_P s=(S_P)malloc(sizeof(S_P));__init(s);
int i;for(i=0;i<10;++i) __push(s,i);
while(!__empty(s)) {printf("%d ",__top(s));__pop(s);}
printf("\n");
}
//=========== SOLVE FUNCTION =======================================
int a[10],b[10],c[20],d[20],cc,n,finish;
char str[11];
void solve(){
S_P s=(S_P)malloc(sizeof(Stack));__init(s);
int i;
while(~scanf("%d",&n)){
while(!__empty(s)) __pop(s);
memset(a,-1,sizeof(a));
memset(b,-1,sizeof(b));
scanf("%s",str+1);
for(i=1;i<=n;++i) a[i]=str[i]-'0';
scanf("%s",str+1);
for(i=1;i<=n;++i) b[i]=str[i]-'0';//命名重名问题
int c_out=1,cc=0,flag=1;i=1;
while(c_out<=n){
if(a[i]==b[c_out]) {
i++;c[cc++]=1;c[cc++]=0;c_out++;
}
else if(!__empty(s)&&__top(s)==b[c_out]) {__pop(s);c_out++;c[cc++]=0;}
else if(i<=n){
__push(s,a[i]);i++;c[cc++]=1;
}
else{
flag=0;break;
}
}
if(flag){
printf("Yes.\n");
for(i=0;i<cc;++i){
if(c[i]==0) printf("out\n");
else if(c[i]==1) printf("in\n");
else printf("in\nout\n");
}
}
else{printf("No.\n");}
printf("FINISH\n");
}
} int main(){
solve();
return 0;
}

手工数据结构系列-C语言模拟栈 hdu1022的更多相关文章

  1. 手工数据结构系列-C语言模拟队列和栈 hdu1702

    #include <stdio.h> #include <stdlib.h> //================= DATA STRUCTURE ============== ...

  2. 手工数据结构系列-C语言模拟队列 hdu1276

    #include <stdio.h> #include <stdlib.h> #define init_size 1000 typedef struct { int head, ...

  3. Javascript与数据结构系列(一)——栈的实现

    栈的实现 实现一个栈,当务之急是决定存储数据的底层数据结构.这里采用的是数组. 我们的实现以定义 Stack 类的构造函数开始: function Stack() { this.dataStore = ...

  4. [数据结构] 用C语言模拟一个简单的队列程序

    #include<stdio.h> #include <stdlib.h> #include<string.h> #include<math.h> // ...

  5. 数据结构之C语言模拟整数数组实现

    #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Arr { in ...

  6. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  7. 数据结构算法C语言实现(七)--- 3.1栈的线性实现及应用举例

    一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 //3_1.h /** author:zhaoyu email: ...

  8. java 16 - 5 LinkedList模拟栈数据结构的集合

    请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...

  9. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

随机推荐

  1. VBA调用数独求解器

    我开发了一个用于求解数独的dll文件,只需要双击一下注册表文件,就可以在VBA中调用这个功能了.具体步骤如下: 下载:https://share.weiyun.com/5dpcNqx 找到ExcelS ...

  2. Redis 实战 —— 03. Redis 简单实践 - Web应用

    需求 功能: P23 登录 cookie 购物车 cookie 缓存生成的网页 缓存数据库行 分析网页访问记录 高层次角度下的 Web 应用 P23 从高层次的角度来看, Web 应用就是通过 HTT ...

  3. 【原创】Linux虚拟化KVM-Qemu分析(八)之virtio初探

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  4. pandas高级操作

    pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...

  5. GlusterFS数据存储脑裂修复方案最全解析

    本文档介绍了glusterfs中可用于监视复制卷状态的heal info命令以及解决脑裂的方法 一. 概念解析 常见术语 名称 解释 Brick GlusterFS 的基本存储单元,由可信存储池中服务 ...

  6. LVS负载均衡NAT模式原理介绍以及配置实战

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  7. RabbitMq消费者在初始配置之后进行数据消费

    RabbitMq消费者在初始配置之后进行数据消费 问题背景 在写一个消费rabbitmq消息的程序是,发现了一个问题,消费者的业务逻辑里面依赖这一些配置信息,但是当项目启动时,如果队列里面有积压数据的 ...

  8. Microsoft Windows的消息循环

    https://zh.wikipedia.org/wiki/Microsoft_Windows的訊息迴圈 微软视窗操作系统是以事件驱动做为程序设计的基础.程序的线程会从操作系统获取消息.应用程序会不断 ...

  9. 服务器端IO模型的简单介绍及实现 阻塞 / 非阻塞 VS 同步 / 异步 内核实现的拷贝效率

    小结: 1.在多线程的基础上,可以考虑使用"线程池"或"连接池","线程池"旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲 ...

  10. HTTPS学习(一):准备知识

    div.example { background-color: rgba(229, 236, 243, 1); color: rgba(0, 0, 0, 1); padding: 0.5em; mar ...