【编程题目】栈的 push、pop 序列
29.栈的 push、pop 序列(栈)
题目:输入两个整数序列。其中一个序列表示栈的 push 顺序,
判断另一个序列有没有可能是对应的 pop 顺序。
为了简单起见,我们假设 push 序列的任意两个整数都是不相等的。
比如输入的 push 序列是 1、2、3、4、5,那么 4、5、3、2、1 就有可能是一个 pop 系列。
因为可以有如下的 push 和 pop 序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的 pop 序列就是 4、5、3、2、1。
但序列 4、3、5、1、2 就不可能是 push 序列 1、2、3、4、5 的 pop 序列。
思路:
首先,我记录了每个pop序列中每一个元素对应在push序列中的位置。这就像是把push序列强制成0 1 2 3 4...一样,这样push序列就是从小到大排列的了。
然后,观察从小到大排列的push序列,其合理的pop序列的特点。
4 5 3 2 1
记录第1个数字 并查找递增的数字 这里是 4 5 他们是递增的。
3 4 2 1 5
3 4 5 递增的
发现只要这些数字符合递增规律,那么pop序列就是合理的。且这些序列就是新加入数字后开始弹出的值。
还是拿3 4 2 1 5举例
3 是在压入1 2 3后弹出的第一个值
4 是在压入4后弹出的第一个值
5 是在压入5后弹出的第一个值
4 2 1这个递减的序列表示,没有压入新值,一直在弹出。
即,有递增序列表示有压入新的值,递减序列表示一直弹出。因为push序列时递增的,故压入的新值只能越来越大。
对于4、3、5、1、2
4 5 2 显然不满足递增关系 即压入5后不能再压入2 不是合法的pop序列
注:我没法证明,不知道是不是所有的都符合这个规律。谁能举出反例吗?
/*
29.栈的 push、pop 序列(栈)
题目:输入两个整数序列。其中一个序列表示栈的 push 顺序,
判断另一个序列有没有可能是对应的 pop 顺序。
为了简单起见,我们假设 push 序列的任意两个整数都是不相等的。
比如输入的 push 序列是 1、2、3、4、5,那么 4、5、3、2、1 就有可能是一个 pop 系列。
因为可以有如下的 push 和 pop 序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的 pop 序列就是 4、5、3、2、1。
但序列 4、3、5、1、2 就不可能是 push 序列 1、2、3、4、5 的 pop 序列。
start time = 16:15
end time = 17:20
*/ #include <stdio.h> int * getlocation(int data, int * poplist, int len)
{
for(int i = ; i < len; i++)
{
if(data == poplist[i])
return poplist + i;
}
return NULL;
}
bool ispop(int * pushlist, int * poplist, int len)
{
for(int i = ; i < len; i++) //记录pop中的数字对应push中那个位置
{
int * loc = getlocation(pushlist[i], poplist, len);
if(loc != NULL)
{
*loc = i;
}
else
{
printf("error:the two list have different member!");
}
} int IncreaseNum2 = poplist[];
int IncreaseNum1;
for(int i = ; i < len; i++)
{
if(poplist[i] > poplist[i - ])
{
IncreaseNum1 = IncreaseNum2;
IncreaseNum2 = poplist[i];
if(IncreaseNum2 < IncreaseNum1)
return false;
}
}
return true;
} int main()
{
int a[] = {,,,,};
int b[] = {,,,,};
bool is = ispop(a, b, );
return ;
}
网上答案:网上的思路惊人的一致,都是直接的建一个栈来模拟这个过程。比我的思路来的要好,计算少,又好理解。
http://blog.sina.com.cn/s/blog_a46817ff01019vtd.html
如果我们希望pop的数字正好是栈顶数字,直接pop出栈即可;如果希望pop的数字目前不在栈顶,我们就到push序列中还没有
*
被push到栈里的数字中去搜索这个数字,并把在它之前的所有数字都push进栈。如果所有的数字都被push进栈仍然没有找到这
*
个数字,表明该序列不可能是一个pop序列。
网上随便找了个代码,还没验证http://www.cnblogs.com/aLittleBitCool/archive/2011/03/05/1971689.html
//栈的push、pop序列 #include<iostream>
#include<stack>
const int SIZE=; //定义长度
using namespace std;
bool judge(int Spush[],int Spop[]){
stack<int> my_stack;
int iPush=,iPop=;
while(iPush<SIZE){ //当栈顶和pop相等时,将pop后的栈顶与pop之后的元素相比,直到不等
cout<<"push "<<Spush[iPush]<<endl; //测试
my_stack.push(Spush[iPush]);
while(!my_stack.empty()&&iPop!=&&my_stack.top()==Spop[iPop]){ //小心数组越界
cout<<"pop "<<Spop[iPop]<<endl; //测试
iPop++;
my_stack.pop();
}
iPush++;
}
if(iPop==SIZE) return true;
else return false;
}
int main(void){
int Spush[SIZE],Spop[SIZE];
for(int i=;i<SIZE;i++)
cin>>Spush[i];
for(int i=;i<SIZE;i++)
cin>>Spop[i];
if(judge(Spush,Spop)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
system("pause");
return ;
}
【编程题目】栈的 push、pop 序列的更多相关文章
- 29. 栈的push,pop序列
题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序 解:其实这题主要是判断进栈次数和出栈次数誓不是相等.我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此 ...
- 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间. 题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一个 ...
- 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)
32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...
- 栈的push、pop序列 【微软面试100题 第二十九题】
题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...
- Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序
题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1. ...
- 24.栈的push和pop序列[StackPushPopSequence]
[题目] 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2 ...
- (栈)栈 给定push序列,判断给定序列是否是pop序列
题目: 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2. ...
- 每天一道算法题(11)——栈的push、pop 序列
题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
随机推荐
- CATransition-转场动画
CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点 UINavigationController就是通过CATrans ...
- 解决 Mac Pro 用 Excel 打开 CSV 文件不能正常显示的问题
在做系统后台的时候,往往会有导出系统信息(如,用户信息)功能,一般导出为CSV文件. 先前在 Windows 下,导出的CSV文件用 Excel 打开能正常显示,可现在在 Mac 系统中,显示一团乱, ...
- RDS记录
rdsafbnr32uzayn.mysql.rds.aliyuncs.com r7fysfqs90r74cm6
- mysql基础面试
php面试题之五--MySQL数据库(基础部分) 五.MySQL数据库 mysql_num_rows() mysql_affected_rows() 这两个函数都作用于 mysql_query($qu ...
- Javascript高级程序设计——基本概念(一)
一.语法 EMCA-262通过叫做ECMAScript的“伪语言”为我们描述了javascript实现的基本概念 javascript借鉴了C的语法,区分大小写,标示符以字母.下划线.或美元符号($) ...
- Java多线程基础知识(五)
一. Java中的13个原子操作类 在Jdk1.5中,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全的更新一个变量的方式. 1. 原子更新基本类型类 AtomicBoolean : 原子更 ...
- Android中加载位图的方法
Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...
- C语言 homework (3)
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() { ; char c; do{ ...
- js之作用域和面向对象
作用域 JavaScript以函数为作用域 函数的作用域在函数未被调用之前,已经创建 函数的作用域存在作用域链,并且也是在被调用之前创建 示例一 xo = "alex"; func ...
- PL/Cool
毛子 2003 Petrozavodsk, Final Contest, 8.30.03. G. PL/Cool 实现一个程序,使它读入一段PL/Cool程序,并输出它的结果. PL/Cool语法 b ...