【剑指offer】堆栈推弹出序列
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863
剑指offer上的第22题,九度OJ上AC。
- 题目描写叙述:
-
输入两个整数序列。第一个序列表示栈的压入顺序,请推断第二个序列是否为该栈的弹出顺序。假设压入栈的全部数字均不相等。
比如序列1,2,3,4,5是某栈的压入顺序,序列4。5,3,2,1是该压栈序列相应的一个弹出序列。但4,3,5,1,2就不可能是该压栈序列的弹出序列。
- 输入:
-
每一个測试案例包括3行:
第一行为1个整数n(1<=n<=100000),表示序列的长度。
第二行包括n个整数。表示栈的压入顺序。
第三行包括n个整数,表示栈的弹出顺序。
- 输出:
-
相应每一个測试案例,假设第二个序列是第一个序列的弹出序列输出Yes。否则输出No。
- 例子输入:
-
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
- 例子输出:
-
Yes
No
判定方法例如以下:
假设第二个序列中当前要推断的元素刚好与栈顶元素相等,则直接pop出来,假设不等,则将第一个序列的后面还没有入栈的元素入栈,直到将与之相等的元素入栈为止,假设第一个序列的全部的元素都入栈了。还没有找到与之相等的元素,则说明第二个序列不是第一个序列的弹出序列,
AC代码例如以下:
/*
本程序採用数组模拟栈
*/
typedef int ElemType;
#define MAX 100000 //栈的深度
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> int top = -1;
/*
在栈顶索引指针为top时。向栈A中压入数据data
*/
bool push(int *A,ElemType data)
{
if(top>=MAX-1 || top<-1)
return false; A[++top] = data;
return true;
} /*
在栈顶索引指针为top时,出栈
*/
bool pop()
{
if(top<0)
return false; top--;
return true;
} /*
推断popList是否是pushList的弹出序列
*/
bool IsPopOrder(int *pushList,int *popList,int len,int *stack)
{
if(popList==NULL || pushList==NULL || len<1)
return false; int i;
int pushIndex = 0;
for(i=0;i<len;i++)
{
while(top==-1 || stack[top] != popList[i])
{
//假设没有元素能够push了,就说明不符合
if(pushIndex == len)
return false;
push(stack,pushList[pushIndex++]);
}
pop();
}
return true;
} int main()
{
int n;
int stack[MAX]; //辅助栈
while(scanf("%d",&n) != EOF)
{
int *pushList = (int *)malloc(n*sizeof(int));
if(pushList == NULL)
exit(EXIT_FAILURE);
int i;
for(i=0;i<n;i++)
scanf("%d",pushList+i); int *popList = (int *)malloc(n*sizeof(int));
if(popList == NULL)
exit(EXIT_FAILURE);
for(i=0;i<n;i++)
scanf("%d",popList+i); if(IsPopOrder(pushList,popList,n,stack))
printf("Yes\n");
else
printf("No\n"); free(pushList);
pushList = NULL;
free(popList);
popList = NULL;
}
return 0;
}
/************************************************************** Problem: 1366 User: mmc_maodun Language: C Result: Accepted Time:210 ms Memory:2012 kb****************************************************************/版权声明:本文博主原创文章。博客,未经同意不得转载。
【剑指offer】堆栈推弹出序列的更多相关文章
- 【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...
- 剑指Offer——翻转单词顺序列
题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“studen ...
- 【剑指offer】判断出栈序列是否合法
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应 ...
- 【剑指offer】找出数组中出现一次的两个数
2013-09-08 10:50:46 一个整型数组中,除了两个数字之外,其他数字都出现了2次,找出这两个只出现一次的数字,要求时间复杂度是O(N),空间复杂度是O(1). 小结: 任何数与0异或,结 ...
- 剑指Offer:找出数组中出现次数超过一半的元素
题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...
- 【剑指offer】找出数组中任意一个重复的数字,C++实现
原创博文,转载请注明出处! # 题目 # 思路 对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同.如果存在重复数字,则在排序的过程中会出现不同下标对应 ...
- 【剑指offer】找出数组中任意重复的数字(不修改数组),C++实现
原创博文,转载请注明出处! # 题目 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改输入的数组.例如,如果输入长度 ...
- 【剑指offer】判断一个序列是否是二叉搜索树的后序遍历,C++实现
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出N ...
- [读]剑指offer
研二的开始找工作了,首先祝愿他们都能够找到自己满意的工作.看着他们的身影,自问明年自己这个时候是否可以从容面对呢?心虚不已,赶紧从老严那儿讨来一本<剑指offer>.在此顺便将自己做题所想 ...
随机推荐
- js+html+css简单的互动功能页面(2015知道几乎尖笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2
js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html? from=y1.7-1. ...
- JAVA jdbc(数据库连接池)学习笔记(转)
学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些 ...
- vmware 10 注冊码
先安装VMware Workstation 10.0原版,然后用以下的随意一个VMware Workstation序列号注冊 1Y0LW-4WJ9N-LZ5G9-Z81QP-92PN7 JU052-F ...
- SP2010 3D标签云Web部分--很酷的效果,强烈推荐!!
SP2010 3D标签云Web部分--很酷的效果.强烈推荐! ! 项目描述叙事 基于简单Flash的3D标签云Web部件.SP Server 2010使用. 建立在内置标签云Web部件 ...
- 升级到tomcat8时Artifact SpringMvcDemo:war exploded: Server is not connected. Deploy is not
The method getDispatcherType() is undefined for the type HttpServletRequest 升级到tomcat8 http://segmen ...
- MVC 应用免受 CSRF攻击
保护ASP.NET 应用免受 CSRF 攻击 CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack ...
- 【SEO 决胜网络索引】 课程大纲及第一部分第一课:网络营销战略中的索引
内容简介 1.课程大纲 2.第一部分第一课: 网络营销战略中的索引 3.第一部分第二课预告: 索引是什么 课程大纲 现在是网络为王的时代,人们越来越离不开互联网: SEO(Search Engine ...
- 【C语言探索之旅】 第二课:工欲善其事,必先利其器
内容简介 1.课程大纲 2.第一部分第二课:工欲善其事,必先利其器 3.第一部分第三课预告:你的第一个程序 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...
- Orleans:NET的Actor模型
.NET的Actor模型:Orleans Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展 ...
- linux 下安装mysql
看以下这篇文章就够了 http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 查看有没有安装过: ...