栈的压入与弹出

这个题目,其实考的是栈的本质问题,也就是它的压入和弹出的顺序。首先我们分析题目
中所给的那几个例子,也就是数据的压入顺序是1、2、3、4、5。但是弹出的顺序是4、5、
3、2、1。这个好办啦,猜都能猜到它是如何操作的。

我们直观上看是这样,但是实际上,给你一个压入数组,一个弹出的数组,如何去判断它
的正确性呢?
其实我们可以根据这两个数组进行分析:

从上面可以看到,首先弹出的是4,因此栈顶肯定是4啦,但是此时栈里只有4吗?
肯定不是,因为先入先出嘛,看第一个数组,先压入了1、2、3.再压入了4,下
面的数组则先弹出了4.,而且第二个数组中,3、2、1在4后面。因此,此时栈里至少
有1、2、3.但是5呢?
第一个数组中,5在四后面才压入,因此里面肯定没有5.但是第二个数组中,5在4后面弹出
则知,5压入后就弹出了。



  1. #ifndef STACK_PUSH_POP_SEQ_H
  2. #define STACK_PUSH_POP_SEQ_H
  3. #include<iostream>
  4. #include<stack>
  5. bool stackPPseq(const int *pPussh,const int *pPop,int nLength){
  6. int pushIndex=0;
  7. int popIndex=0;
  8. std::stack<int> m_stack;
  9. if(pPussh==NULL||pPop==NULL||nLength==0){
  10. return false;
  11. }
  12. while(pushIndex<nLength&&popIndex<nLength){
  13. if(m_stack.empty()){ //如果栈为空,则一直从题目给的压栈顺序数组中提取元素压入栈中,直到碰到一个与弹出数组相等的元素。
  14. while(pPussh[pushIndex]!=pPop[popIndex]){
  15. m_stack.push(pPussh[pushIndex]);
  16. ++pushIndex;
  17. }
  18. m_stack.push(pPussh[pushIndex]);
  19. }
  20. if(m_stack.top()==pPop[popIndex]){ //如果弹出栈的数组元素与栈顶的元素相等,则一直弹。
  21. while(m_stack.top()==pPop[popIndex]){
  22. m_stack.pop();
  23. popIndex++;
  24. if(popIndex==nLength){
  25. return true;
  26. }
  27. }
  28. }
  29. if(m_stack.top()!=pPop[popIndex]){//如果栈顶没有与弹出数组元素相等的,则再压。
  30. while(m_stack.top()!=pPop[popIndex]){
  31. pushIndex++;
  32. if(pushIndex==nLength){
  33. break;
  34. }
  35. m_stack.push(pPussh[pushIndex]);
  36. }
  37. }
  38. }
  39. if(pPop[popIndex]==m_stack.top()){
  40. m_stack.pop();
  41. popIndex++;
  42. if(popIndex>=nLength){
  43. return true;
  44. }
  45. }
  46. return false;
  47. }
  48. #endif












posted @ 2015-07-17 19:28  yml435  阅读(360)  评论(0编辑  收藏  举报