判断出栈入栈合法性

    本次博客中,分享一下关于栈和队列中经典题目——如何判断出栈入栈合法性的流程,思路以及代码实现。

流程图:


思路: 
  首先需要判断出栈序列popV和入栈序列pushV的大小是否相同。并用push_index和pop_index来表示出栈和入栈序列的下标,借此来表示此时的入栈和出栈元素。
  
  1》不相同,即证明出栈入栈不合法,返回false.
  
  2》相同,继续下面的循环体
  
 判断出栈入栈的循环体。
 
 (1)判断栈是否为空。
 
(1.1)如果栈不为空,判断指向的出栈元素和栈顶元素是否一致。
   
        (1.1.1)如果一致,pop栈顶元素,指向出栈元素的下一个,即pop_index++。然后继续(1)。
  
    (1.1.2)如果不一致,继续(1.2)。
(1.2)如果栈为空或者满足(1.1.2),用出栈序列popV中去找,是否存在入栈队列中与出栈队列相同元素的元素。
  
    (1.2.1)如果在入栈序列中找到,出栈序列和入栈序列都指向下一个元素,即pop_index++,push_index++。
  
    (1.2.2)如果没有在入栈序列中找到,判断push_index >= pushV是否成立。
    
        (1.2.2.1)结论不成立,即push_index < pushV,把这个元素入栈,然后入栈序列指向下一个元素,即push_index++,继续循环体(1)。
        (1.2.2.2)结论成立,即push_index >= pushV,遍历所有入栈元素未找到与出栈元素相同的元素,即证明出栈入栈不合法,返回false.

 结束循环条件:
   只有当出栈元素pop_index== popV.size().才会结束循环并返回true.



代码如下:


#include<iostream>
using namespace std;
#include<vector>
#include<stack>

    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size() != popV.size()) return false;
        int push_index = 0;
        int pop_index = 0;
        
        stack<int> s;
        
        while(pop_index < popV.size()){
            if(!s.empty() && s.top() == popV[pop_index]){
                pop_index ++;
                s.pop();
                continue;
            }
           if(push_index < popV.size() && pushV[push_index] == popV[pop_index]){
                pop_index ++;
                push_index ++;
			}
           else if(push_index >= popV.size())
		   {
				return false;
		   }
			else{
                s.push(pushV[push_index]);
                push_index ++;
            }
	}  
            return true;
    }


int main()
{
	int a[] = {1,2,3,4,5};
	int b[] = {4,5,1,2,3};//0
	//int b[] = {4,5,3,2,1};//1
	vector<int> push;
	vector<int> pop;


	for(int i=0; i<5; i++){
		push.push_back(a[i]);
		pop.push_back(b[i]);
	}


	cout<<IsPopOrder(push, pop)<<endl;


	system("pause");
	return 0;
}

分享如上,望共同进步!good luck to you!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值