29.栈的push、pop序列(栈)

来源:互联网 发布:淘宝宝贝上架下架规律 编辑:程序博客网 时间:2024/05/17 23:15
题目:输入两个整数序列。其中一个序列表示栈的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序列。

 

这里首先是以第一个数为基准,以后出现的序号比第一个数小的要一次减小,比第一个数大的要依次增大,这样就符合出栈顺序。

 

#include <iostream>bool bepop(int* output,int* input,int n);int pos(int* input,int n,int m);//求在出栈中的位置int main(){int input[9] = {1,2,3,4,5,6,7,8,9};int output[9] = {4,5,3,6,2,7,8,9,1};bool bnow = bepop(output,input,9);return 0;}bool bepop(int* output,int* input,int n){if (input == NULL)return false;int i =0 ;int posmin = -1 ;//比首位置小的点int posbig = -1 ;//比首位置大的点int posnow = -1;//首位置的点posnow = pos(input,n,output[i]);i++;for (;i<n;i++){int k = 0;k=pos(input,n,output[i]);if (k>posnow){if (posbig == -1)posbig = k ;else if (posbig>k)return false;else posbig = k;}else{if (posmin == -1)posmin = k;else if (posmin<k)return false ;else posmin = k;}}return true;}int pos(int* input,int n,int m){for (int i=0;i<n;i++)if (input[i] == m)return i;return -1;}