手工数据结构系列-C语言模拟栈 hdu1022
这个题我一开始是这么想的。。
爆搜所有可能的出栈序列
然后对输入进行匹配
这样我感觉太慢
然后我们可以想到直接通过入栈序列对出栈序列进行匹配
但是我犯了一个错误。。那就是出栈序列一定到入栈序列里找。。
找不到的入栈,最后弹栈,弹不空的就是不合法序列
但是这里有一个逻辑不对。。为什么最后才弹栈呢。。为什么中间不能从非空栈中弹栈呢
所以,出栈序列要么和入栈序列匹配要么和已经入栈的栈顶匹配,要么安排入栈序列元素入栈,
如果入栈序列和入栈的栈顶都无法匹配且入栈序列无法入栈,那么匹配出错
对于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的更多相关文章
- 手工数据结构系列-C语言模拟队列和栈 hdu1702
#include <stdio.h> #include <stdlib.h> //================= DATA STRUCTURE ============== ...
- 手工数据结构系列-C语言模拟队列 hdu1276
#include <stdio.h> #include <stdlib.h> #define init_size 1000 typedef struct { int head, ...
- Javascript与数据结构系列(一)——栈的实现
栈的实现 实现一个栈,当务之急是决定存储数据的底层数据结构.这里采用的是数组. 我们的实现以定义 Stack 类的构造函数开始: function Stack() { this.dataStore = ...
- [数据结构] 用C语言模拟一个简单的队列程序
#include<stdio.h> #include <stdlib.h> #include<string.h> #include<math.h> // ...
- 数据结构之C语言模拟整数数组实现
#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Arr { in ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(七)--- 3.1栈的线性实现及应用举例
一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 //3_1.h /** author:zhaoyu email: ...
- java 16 - 5 LinkedList模拟栈数据结构的集合
请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
随机推荐
- Java基础复习2
三目运算符 语法:条件判断?表达式1:表达式2; 如果条件判断成立则获取值1否则获取值2 public class demo1{ public static void main(String[ ...
- Ice系列--基于IceGrid的部署方案
前言 前一篇文章介绍了IceGrid的简单应用.这篇文章来介绍一下它的高端玩法-如何将模板,复制组,知名对象应用于部署方案及其作用. 基于模板的部署方案 之前介绍了xml格式的配置文件通过各种描述符如 ...
- 第2章_神经网络入门_2-5&2-6 数据处理与模型图构建
目录 神经元的TF实现 安装 神经网络的TF实现 神经元的TF实现 安装 版本: Python 2.7 tf 1.8.0 Linux 略 demo 神经网络的TF实现 # py36 tf 2.1. # ...
- c#使用谷歌身份验证GoogleAuthenticator
此功能相当于给系统加了个令牌,只有输入对的一组数字才可以验证成功.类似于QQ令牌一样. 一丶创建最核心的一个类GoogleAuthenticator 此类包含了生成密钥,验证,将绑定密钥转为二维码. ...
- LOJ10145郁闷的出纳员
传送门:https://loj.ac/problem/10145 简单的平衡树 ------------------------------------ 1 #include<bits/stdc ...
- Java 执行过程中的内存模型
一.前言 本文的主要工作:尝试以时间顺序追踪一遍 Java 执行的整个过程,以及展示 JVM 中内存模型的相应变化. 本文的主要目的:希望能够通过 Java 执行过程的冰山一角,增进对编程语言工作原理 ...
- k8s之集群管理
导读 经过前面k8s系列的文章,这一系列已经基本完成,现在就用几篇文章说一下日常的集群维护. 目录 更新资源对象的Label Namespace:集群环境共享与隔离 部署集群监控 部署Web UI管理 ...
- 一文打尽端口复用 VS Haproxy端口复用
出品|MS08067实验室(www.ms08067.com) 本文作者:Spark(Ms08067内网安全小组成员) 1.概述 Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tc ...
- new的过程是怎样的?看完这一篇就懂了
在现实世界中,找对象是一门学问,找对象不在于多而在于精 在计算机世界中,面向对象编程的关键在于能否灵活地运用类,如何设计出一个符合需求的对象也是也是值得学习和思考的. 那么,面向对象编程到底是什么? ...
- Excel 快速填充:填充柄+数据验证
鼠标左键拖拽填充或者双击填充 右键拖拽填充: 可以填充等比数列.工作日等等 数据验证: 通过下拉箭头快速选择数据: 选择单元格区域-[数据]-[数据验证]-序列 数据科学交流群,群号:18915878 ...