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 序列的更多相关文章

  1. 29. 栈的push,pop序列

    题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序 解:其实这题主要是判断进栈次数和出栈次数誓不是相等.我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此 ...

  2. 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)

    普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间. 题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一个 ...

  3. 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

    32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...

  4. 栈的push、pop序列 【微软面试100题 第二十九题】

    题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...

  5. Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1. ...

  6. 24.栈的push和pop序列[StackPushPopSequence]

    [题目] 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2 ...

  7. (栈)栈 给定push序列,判断给定序列是否是pop序列

    题目: 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2. ...

  8. 每天一道算法题(11)——栈的push、pop 序列

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...

  9. 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应

    出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...

随机推荐

  1. CATransition-转场动画

    CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点 UINavigationController就是通过CATrans ...

  2. 解决 Mac Pro 用 Excel 打开 CSV 文件不能正常显示的问题

    在做系统后台的时候,往往会有导出系统信息(如,用户信息)功能,一般导出为CSV文件. 先前在 Windows 下,导出的CSV文件用 Excel 打开能正常显示,可现在在 Mac 系统中,显示一团乱, ...

  3. RDS记录

    rdsafbnr32uzayn.mysql.rds.aliyuncs.com r7fysfqs90r74cm6

  4. mysql基础面试

    php面试题之五--MySQL数据库(基础部分) 五.MySQL数据库 mysql_num_rows() mysql_affected_rows() 这两个函数都作用于 mysql_query($qu ...

  5. Javascript高级程序设计——基本概念(一)

    一.语法 EMCA-262通过叫做ECMAScript的“伪语言”为我们描述了javascript实现的基本概念 javascript借鉴了C的语法,区分大小写,标示符以字母.下划线.或美元符号($) ...

  6. Java多线程基础知识(五)

    一. Java中的13个原子操作类 在Jdk1.5中,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全的更新一个变量的方式. 1. 原子更新基本类型类 AtomicBoolean : 原子更 ...

  7. Android中加载位图的方法

    Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...

  8. C语言 homework (3)

      #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { ; char c; do{ ...

  9. js之作用域和面向对象

    作用域 JavaScript以函数为作用域 函数的作用域在函数未被调用之前,已经创建 函数的作用域存在作用域链,并且也是在被调用之前创建 示例一 xo = "alex"; func ...

  10. PL/Cool

    毛子 2003 Petrozavodsk, Final Contest, 8.30.03. G. PL/Cool 实现一个程序,使它读入一段PL/Cool程序,并输出它的结果. PL/Cool语法 b ...