面试题22 已知压入序列 判断弹出序列正不正确


思路:如果下一个弹出的数字刚好是栈顶数字,则直接弹出。若下一个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。若所有的数字都压入栈了仍没有找到下一个弹出的数字,则表明该序列不可能滴一个弹出序列。

代码:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <stack>  
  4. using namespace std;  
  5.   
  6. bool IsPopOrder(int *pPush, int *pPop, int nLength)  
  7. {  
  8.    if (pPush == NULL || pPop == NULL || nLength <= 0)  
  9.    {  
  10.        return false;  
  11.    }  
  12.   
  13.    stack<int> s;  
  14.    s.push(pPush[0]);  
  15.    int nPop_index = 0;  
  16.    int nPush_index = 1;  
  17.    while (nPop_index < nLength)  
  18.    {  
  19.        while (s.top() != pPop[nPop_index] && nPush_index < nLength)  
  20.        {  
  21.            s.push(pPush[nPush_index]);  
  22.            nPush_index++;  
  23.        }  
  24.   
  25.        if (s.top() == pPop[nPop_index])  
  26.        {  
  27.            s.pop();  
  28.            nPop_index++;  
  29.        }  
  30.        else  
  31.        {  
  32.            return false;  
  33.        }         
  34.    }  
  35.   
  36.    return true;  
  37. }  
  38.   
  39. int _tmain(int argc, _TCHAR* argv[])  
  40. {  
  41.     int nPush[5] = {1,2,3,4,5};   
  42.     int nPop1[5] = {4,5,3,2,1};  
  43.     int nPop2[5] = {4,3,5,1,2};  
  44.     int nPop3[5] = {5,4,3,2,1};  
  45.     int nPop4[5] = {4,5,2,3,1};  
  46.     cout << IsPopOrder(nPush, nPop1, 5) << endl;  
  47.     cout << IsPopOrder(nPush, nPop2, 5) << endl;  
  48.     cout << IsPopOrder(nPush, nPop3, 5) << endl;  
  49.     cout << IsPopOrder(nPush, nPop4, 5) << endl;  
  50.     system("pause");  
  51.     return 0;  
  52. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值