【剑指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>.在此顺便将自己做题所想 ...
随机推荐
- => 朗姆达表达式带入符号
=> 是朗姆达表达式中的用法,是指向的意思具体就是是把=>左边声明的变量带入到=>右边的表达式或者代码段里.
- "Cannot find entry symbol nable-stdcll-fixup; defaulting to 00401000" 解决方案
在使用Qt 4.7.3, Qt 4.7.2 ,Qt 4.7.1(mingw 4.6.2 )的时候都会有一个问题无法编译通过,即用Qt Creator 编译的时候会发生一个错误 "Cannot ...
- MIPS台OpenWrt在系统内的路由器Rust应用程序开发
笔者:Liigo(庄小莉) 迄今:2014年9一个月17日本 (9一个月29日更新,11一个月19日本再次更新.在最后可用更新) 原文链接:http://blog.csdn.net/liigo/art ...
- Codeforces Round #258 (Div. 2) B. Sort the Array
题目链接:http://codeforces.com/contest/451/problem/B 思路:首先找下降段的个数,假设下降段是大于等于2的,那么就直接输出no,假设下降段的个数为1,那么就把 ...
- android 中国通信乱码问题
1.要解决中文乱码问题.首先得了解什么是字符编码 计算机要处理各种字符,就须要将字符和二进制内码相应起来,这样的相应关系就是字符编码. 要制定字符编码首先要确定字符集,并将 字符集内的字符排序.然后和 ...
- PhoneGap 开发与应用 上传 App Store 在
几个简单的归纳过程,前提是你有一个开发者账户,而且必须有Mac 虚拟机或真机.尽管WIndows 也可以上载证书.但最终也必须用于上传应用程序 Xcode 要么 Application Loader ...
- RH033读书笔记(7)-Lab 8 Introduction to String Processing
Lab 8 Introduction to String Processing Sequence 1: Exercises in string processing 1. Other than the ...
- malloc使用方法
malloc使用方法 须要包括头文件: #include 'stdlib.h' 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个 ...
- 游戏 TRAP(SNRS)AlphaBeta版本
大家好,我是PuzzledBoy,大一(大二快).我是一个独立的游戏开发商,我的梦想是成为一名伟大的艺术家的第九 今天来公布我的第一个独立游戏TRAP(SNRS)的Alpha測试版啦啦啦~~~! 游戏 ...
- 假设synthesize省略,语义属性声明assign retain copy时间,为了实现自己的setter和getter方法
假设synthesize省略,而且我们自己实现setter和getter方法时,系统就不会生成相应的setter和getter方法,还有实例变量 1,当把语义特性声明为assign时,setter和g ...