输入入栈序列判断出栈序列是否合法(c语言实现)

2023-10-30

题目:

分别给定入栈序列和出栈序列,然后判断出栈序列是否合法。如入栈序列是[6,5,4,3,2,1],出栈序列[4,5,3,1,2,6]是合法的,[3,4,6,5,2,1]是不合法的。


思路

判断出栈序列是否合法的标准是:栈顶如果是需要出栈的元素,则出栈,如果不是则将未入栈的元素按入栈序列依次入栈,直到栈顶为出栈的元素。如果所有元素都入栈了,仍然没有找到要弹出的元素,那么该出栈序列是不合法的。

创建一个临时数组存放入栈的元素,找到出栈序列第一个元素在入栈序列中的位置j,将j和j前面的元素加入临时数组中然后出栈序列中的元素依次与出栈序列j后面的元素和临时数组的栈顶元素进行判断如果与一分相同则消掉进行下一次判断.如果在入栈序列和临时数组都没有找到则在入栈序列中进行再次查找将找到的元素与j之间的元素加入临时数组中再重复上面的操作,如果没有找到则出栈序列是不合法的


 

一、运行实例

 

二、完整代码(详尽注释)

 

#include <stdio.h>  
#define maxn 50  
int out[maxn];//出栈序列
int one[maxn];//入栈序列
//打印出数组 入口参数依次为 要打印的数组 起始 结束
void debug(int* one,int i,int n)
{
	printf("\n打印出来为\n");
	for(i;i<=n;i++)
		printf("%d ",one[i]);
	printf("\n");
	
}
//入口参数依次为序列长度 入栈序列 出栈序列
int check(int n,int* one,int* out) 
{  
	int i,j,oot[50],top=-1,t=0;//i 用于循环 j代表入栈序列的下标 ott新建的临时数组 
	//top指向ott栈顶下标的变量等于-1时栈为空  t代表出栈序列的下标

	int m=0,j1,j2,cs=0;//当out[t]!=one[j]或out[t]!=ott[top]时加1如果一次循环中m=2则触发将入栈序列加入临时数组的语句
	//ji=j-1表示j在移动前的位置-1用于判断新的临时数组长度 j2=j1表示j在移动前的位置用来进行for循环 cs比较成功的次数

	//先找到和out第一个数据相同的one下标
	for(i=0;i<n;i++)
	{
		if(one[i]==out[0])
		{
			j=i;
			printf("第一个相同的下标为 %d\n",j);
			break;
		}
	}
	//将第一个下标之前的元素储存入oot数组
	for(i=0;i<=j;i++)
	{
		oot[i]=one[i];
	}
	top=j;//临时数组的最大下标为j
	j++;//入栈序列的下标跳过已经加入临时数组的数
	while(1)//使用break退出
	{
		printf("\n\n本次循环开始时j= %d t= %d top= %d \n\n ",j,t,top);
		m=0;//每次循环开始时清0 保证当m=2时是两个条件同时不满足的情况
		//你可能会问为什么不使用&& 那样会不知道是t++还是j++
		if((out[t]==oot[top]))
		{
			cs++;//使成功比较次数加1
			printf("%d.输出的 %d 将临时的数组 %d 换掉\n",cs,out[t],oot[top]);
			top=top-1;//将临时数组的最大下标减1
			t++;//将出栈序列的最大下标加1 进行下一次比较
			
		}
		else
		{
			m++;//不成功次数加1
		}
	
		if(out[t]==one[j])
		{
			cs++;
			printf("%d.输出的 %d 将输入 %d 换掉\n",cs,out[t],one[j]);
			j=j+1;//将入栈序列的最大下标加1
			t++;
				
		}
		else
		{
			m++;//不成功次数加1	
		}

		if(m==2)//当俩次都失败时
		{
			m=0;//清0
			j1=j-1;
			j2=j;
			debug(one,0,n-1);
			debug(out,0,n-1);
			for(i=j;i<n;i++)//找到与out[t]相同的下标 准备将它加入临时数组中
			{
				if(one[i]==out[t])
				{
					j=i;
					printf("相同的下标为 %d\n",j);
					break;
				}
				else
				{
					if(i<=n)//如果都没有找到与out[t]相同的下标则返回0
					{
						printf("未在剩下的序列里找到相同的数-错误\n");
						return 0;
					}
				}
			}
			if(top==-1)//如果为空则覆盖oot[0]
			{	
				for(i=0;i<=j-j1;i++,j2++)//将它加入临时数组中
				{
					oot[i]=one[j2];	
				}
				printf("top=%d j=%d j1=%d\n",top,j,j1);
				top=top+j-j1;
				printf("top_1=%d\n",top);
				debug(oot,0,top);
			}
			else//将它加入临时数组中
			{
				for(i=top+1;i<=j-j1;i++,j2++)
				{
					oot[i]=one[j2];
				}
				printf("top=%d j=%d j1=%d\n",top,j,j1);
				top=top+j-j1;
				printf("top_1=%d\n",top);
				debug(oot,0,top);
			}

		}
		else if(t>=n)//当t>=n时正常结束循环
			break;
	}
	return 1;//正常结束循环返回1

}  
int main()  
{  
    int n,k,i;
	//n代表入栈序列的长度 k代表运行的次数 i用于for循环
	printf("请输入入栈序列的长度和运行次数:");
	scanf("%d %d",&n,&k);
	printf("请输入进栈序列");
	for(i=0;i<n;i++)
	{  
		scanf("%d",&one[i]);
	}
	while(k--){

		printf("请输入出栈序列");
		for(i=0;i<n;i++)
		{  
			scanf("%d",&out[i]);

		}  
		if(check(n,one,out))  
			printf("YES\n");  
		else  
			printf("NO\n"); 	
	}
    return 0;  
}  

如果代码有bug,欢迎评论区留言指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输入入栈序列判断出栈序列是否合法(c语言实现) 的相关文章

随机推荐

  • Nginx 官网及中文官网

    英语官方 http nginx org 中文文档 http www nginx cn doc 转载于 https blog 51cto com hacker3389 1877270
  • 什么是大数据(转自知乎)

    声明 纯属个人收藏用 什么是大数据 大数据只是一个空洞的商业术语 就跟所谓的商业智能一样空洞无物 当然 这并不是说大数据没有意义 只是对于不同的人有不同的含义 A 对于投资人和创业者而言 大数据是个热门的融资标签 就和前几年流行的 SoLo
  • 磁盘快照技术

    一 概念解释 像照相机一样 机器快门一闪 很快就把刚刚的人像停留在了相纸上 存储系统中的数据 快照 与我们生活中所说的 照片 非常相似 所不同的是 照片的对象不是人 而是数据 如同照片留住了我们过去的摸样和岁月 快照把数据在某一时刻的映像也
  • 【数据结构】——顺序表介绍(独家介绍,小白必看!!)

    重点和易错点都用彩笔标记出来了 放心食用 数据结构分为线性表和非线性表 今天我们要学习的顺序表就是线性表中的一个小类 那么 何为线性表 线性表是指n个具有相同性质的数据元素的有限序列 常见的线性表有 顺序表 链表 栈 队列 字符串等等 注意
  • java非递归遍历二叉树 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 都说所有的递归都可以使用非递归的方式来解决 所以这次来一起康康非递归版本的二叉树的遍历 递归的本质就是不断往栈中塞入待执行代码 然后在代码块被执行的时候就会被调用执行
  • java时间格式化错误_java – SimpleDateFormat显示错误的分钟,秒和毫秒

    我已经编写了这个示例程序 我希望将日期转换为另一种格式 使用简单的日期格式时 我看不到预期的日期 public class TestDate param args public static void main String args Si
  • 聊一聊如何用IDEA追踪Bug?

    Debug用来追踪代码的运行流程 通常在程序运行过程中出现异常 启用Debug模式可以分析定位异常发生的位置 以及在运行过程中参数的变化 通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码 Debug开篇 首先看下ID
  • 仅仅上线一小时,下载量就破10W!阿里内部Java性能优化实战手册

    祸兮福之所倚福兮祸之所伏 上学的时候对这句话不以为然 但是在社会上走的时间越长越觉得有道理 前不久好兄弟和领导闹矛盾裸辞了 身为好兄弟的我总不能干看着吧 总要帮他找工作的 你们应该不会想我和他一起裸辞吧 大学的师兄有好几个在大厂 平常关系还
  • 在 Dockerfile 中 CMD 和ENTRYPOINT可以混着用吗?

    在 Dockerfile 中 CMD 和ENTRYPOINT可以混着用吗 在 Dockerfile 中 CMD 和 ENTRYPOINT 是两个不同的指令 它们可以单独使用 也可以结合使用 CMD 指令用于指定容器启动时默认执行的命令 它可
  • 利用回调函数消灭大量分支语句if,case

    1 背景 有这样一个场景 常见的通讯程序中 根据不同的消息类型 调用不同的处理函数 类似于处理登陆 退出登陆 发送消息等类型 上古操作可能会是这样的代码 void dealLogin std cout lt lt received logi
  • Android实现获取应用程序相关信息列表的方法

    本文所述为Androdi获取手机应用列表的方法 比如获取到Android应用的软件属性 大小和应用程序路径 应用名称等 获取所有已安装的Android应用列表 包括那些卸载了的 但没有清除数据的应用程序 同时在获取到应用信息的时候 判断是不
  • 替换字符串中的括号内容(java)

    问题描述 给你一个字符串 s 它包含一些括号对 每个括号中包含一个 非空 的键 比方说 字符串 name is age yearsold 中 有 两个 括号对 分别包含键 name 和 age 你知道许多键对应的值 这些关系由二维字符串数组
  • micropython 固件开发_Micropython编译固件的操作步骤

    目标 编译STM32F4固件并刷入到我们的开发板 STM32F407VET6 1 在Linux系统下进行编译操作 windows用户可以在虚拟机下运行Linux系统 推荐下载kali Linux系统 https www kali org d
  • 16个推荐系统开放公共数据集整理分享

    本文由深度学习与NLP编译 本文主要整理了一些与推荐系统相关的高质量的数据集 整理自Stack Overflow 一些文章 推荐站点和学术实验 其中 大多数数据集都是免费 开放的 但有些不是 需要获得许可或引用作者的工作才能使用 此外 其中
  • 微信云开发——日记小程序

    真正的大师 永远都怀着一颗学徒的心 一 项目简介 前一段时间在网上看到了一个云笔记的小程序 感觉挺不错的 闲暇之余 把他改造了一波 改成了一个专门写日记的小程序 同时 还增加了类似广场的小功能 就是可以把日记设置成公开 让所有的人都能看到
  • redis持久化配置

    redis有两种持久化方式 RDB和AOF 1 RDB配置方式 默认情况下 是快照RDB的持久化方式 将内存中的数据以快照的方式写入二进制文件中 默认的文件名是dump rdb redis conf默认配置 save 900 1 save
  • java多个jdk切换不同版本无法切换且上移环境JAVA_HOME无效的解决方案

    背景 我电脑上之前安好了java19 因为一些原因要下java1 8 发现可以设置计算机里的多个jdk版本 于是兴冲冲的开始了 网上的教程很详细 我也不啰嗦 前面进行的一切顺利 但是我始终无法切换对应的版本号 一直是原来的java19 后面
  • volatile概念详解及使用场景

    文章目录 一 volatile关键字特性 1 概念 2 特性 可见性 有序性 禁止指令重排序 原子性 二 使用场景 模式1 状态标志 模式2 独立观察 independent observation 模式3 一次性安全发布 模式4 vola
  • 1.1.2 python基本数据类型与运算符

    本章引言 任何计算机语言的学习都离不开其基础中的基础 即数据类型和运算 所以要学好一门语言必须具有扎实的基础 后期是否能够灵活使用就取决于第二章 第三章内容是否深而透 变量含义 用来存储一些之后可能会变化的值 对科比投篮ID为 1 的一次投
  • 输入入栈序列判断出栈序列是否合法(c语言实现)

    题目 分别给定入栈序列和出栈序列 然后判断出栈序列是否合法 如入栈序列是 6 5 4 3 2 1 出栈序列 4 5 3 1 2 6 是合法的 3 4 6 5 2 1 是不合法的 思路 判断出栈序列是否合法的标准是 栈顶如果是需要出栈的元素