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

爆搜所有可能的出栈序列

然后对输入进行匹配

这样我感觉太慢

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

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

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

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

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

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

对于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. JVM有哪些垃圾回收器

    JVM 的垃圾回收器 目录 JVM 的垃圾回收器 经典垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel ...

  2. 备份和还原Windows DHCP服务器

    在本教程中,您将学习如何使用DHCP控制台和PowerShell备份和还原Windows DHCP服务器. 您是否曾经经历过DHCP服务器崩溃或故障?在设备开始重新启动之前,一切都会平静. 用户将抱怨 ...

  3. 大促密集,CDN如何保障电商体验如丝般顺滑?

    简介: 前不久,阿里云技术天团空降CSDN在线峰会,对核心技术竞争力进行解读.其中,阿里云高级技术专家曾福华分享了<双11: CDN如何保障电商大促如丝般顺滑>的议题.俗话说:养兵千日,用 ...

  4. 转 9 jmeter之检查点

    9 jmeter之检查点   jmeter有类似loadrunner检查点的功能,就是断言中的响应断言. 1.响应断言(对返回文字结果进行相应的匹配)右击请求-->添加-->断言--> ...

  5. java虚拟机入门(四)-垃圾回收的故事

    谈到垃圾回收器,java程序员骄傲了起来,c语言你是够快,但是你有管家帮你打扫吗,还不是得靠自己的一双手,有钱就是任性.既然如此令java程序员骄傲的垃圾回收器,怎能让人不想去一探究竟呢! 垃圾回收器 ...

  6. 接口新建学习---cookie策略

    一.为什么要添加cookie? 模拟浏览器,因为http是无状态协议,像览器一样的存储和发送Cookie,如果发送一个http请求他的响应中包含Cookie,那么Cookie Manager就会自动地 ...

  7. etcd 与 Zookeeper、Consul 等其它 kv 组件的对比

    基于etcd的分布式配置中心 etcd docs | etcd versus other key-value stores https://etcd.io/docs/v3.4.0/learning/w ...

  8. 7. A typical stream socket session

    http://publibfp.dhe.ibm.com/epubs/pdf/f1a2d400.pdf Read and write data on socket s, using the send() ...

  9. based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较 gevent不是异步 协程原理 占位符 placeholder (Future, Promise, Deferred) 循环引擎 greenlet 没有显式调度的微线程,换言之 协程

    gevent GitHub - gevent/gevent: Coroutine-based concurrency library for Python https://github.com/gev ...

  10. java架构《并发编程框架篇 __Disruptor》

    Disruptor入门   获得Disruptor 可以通过Maven或者下载jar来安装Disruptor.只要把对应的jar放在Java classpath就可以了. 基本的事件生产和消费 我们从 ...