剑指offer 栈的压入、弹出序列

来源:互联网 发布:吉他弹唱录音软件 编辑:程序博客网 时间:2024/06/05 14:58

题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

思路:
模拟入栈操作。定义两个指针,p1,p2,分别指向入栈序列和弹出序列,如果栈顶元素等于当前p2指向的弹出序列元素,则将p2++,然后弹出栈的元素;如果不等于,则p1++,继续入栈,如果p1指向末尾了,p2还没有结束,则失败,否则成功。

#include <cstdio>#include <stack>using namespace std;const int maxn = 100000 + 10;int in[maxn];int out[maxn];int main(){    int n;    int p1, p2;    stack<int> s;    while(scanf("%d", &n) != EOF){        while(!s.empty())            s.pop();        p1 = 0, p2 = 0;        for(int i = 0; i < n; i++){            scanf("%d", &in[i]);        }        for(int i = 0; i < n; i++){            scanf("%d", &out[i]);        }        while(1){            if(s.empty()){                if(p1 == n)                    break;                else                    s.push(in[p1++]);            }            else{                if(s.top() == out[p2]){                    s.pop();                    p2++;                }                else{                    if(p1 == n)                        break;                    else                        s.push(in[p1++]);                }            }        }        if(p2 != n)            printf("No\n");        else            printf("Yes\n");    }    return 0;}
0 0
原创粉丝点击