判断是否为栈的pop序列

输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。

为了简单起见,我们假设push序列的任意两个整数都是不相等的。

程序一:

参考file:///F:/专业资料/微软面试题/题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。%20-%20Mr_Willy的专栏%20-%20博客频道%20-%20CSDN_NET.mht

bool isPopSerial(int input[], int output[], int length)
{
	stack<int> s;
	int pushnum=0;
	int i=0;

	while(i<length)
	{
		while(s.empty() || s.top()!=output[i])
		{
			if(pushnum < length)
				s.push(input[pushnum++]);
			else
				return false;
		}

		while(!s.empty() && s.top()==output[i])
		{
			s.pop();
			i++;
		}
	}
	return true;
}

 

程序二:参见http://www.189works.com/article-14048-1.html

 

bool isStackPushPop(int a[], int b[], int n)
{
	stack<int> s;
	int i=-1, j=0;//i=-1,以及后面的a[++i]是正确的关键;改成i=0, a[i++]就不对了

	while(i<n && j<n)
	{
		if(s.empty() || s.top() != b[j])
			s.push(a[++i]);
		else
		{
			s.pop();
			j++;
		}
	}
	
	return s.empty();
}


程序三:参见http://zhedahht.blog.163.com/blog/static/25411174200732102055385/

bool IsPossiblePopOrder(const int* pPush, const int* pPop, int nLength)
{
	bool bPossible=false;

	if(pPush && pPop && nLength>0)
	{
		const int *pNextPush=pPush;
		const int *pNextPop=pPop;

		stack<int> s;
		while(pNextPop - pPop < nLength)
		{
			while(s.empty() || s.top()!=*pNextPop)
			{
				if(!pNextPush)
					break;

				s.push(*pNextPush);
				if(pNextPush-pPush <nLength-1)
					pNextPush++;
				else
					pNextPush=NULL;

			}

			if(s.top() != *pNextPop)
				break;

			s.pop();
			pNextPop++;

		}

		if(s.empty() && pNextPop-pPop==nLength)
			bPossible=true;

	}

	return bPossible;
}



 

你可能感兴趣的:(判断是否为栈的pop序列)