判斷元素出棧入棧順序的合法性

     思路:假設入棧序列{1,2,3,4,5},出棧序列{4,5,3,2,1};首先我們將入棧序列的第一個元素入棧,這是設置一個指針只想出棧序列的第一個元素,如果出入棧以後,棧頂

元素和出棧指針所指向的元素相等,那麼就讓棧頂元素出棧,讓指針++,最後判斷棧爲空就好,若爲空,就說明是合法的,如果不是就是不合法。

     代碼如下:

#include<iostream>
#include<assert.h>
#include<stack>
using namespace std;
bool IsLegal(int* stackin,int* stackout,int lenin,int lenout)
{
	assert(stackin&&stackout);//判斷入棧、出棧序列不爲空
	if(lenin!=lenout)//入棧長度不等於出棧長度,不合法
	{
		return false;
	}
	stack<int> l1;
	int i=0;
	int j=0;
	for(;i<lenin;++i)
	{
		l1.push(stackin[i]);//將元素一一入棧
		while(l1.size()>0&&l1.top()==stackout[j])//保證棧裏的元素不爲空,並且每次棧頂均要和出棧序列一一匹配
		{
			l1.pop();
			++j;
		}
	}
	if(l1.size()==0)
		return true;
	else
		return false;
}
void TestStack()
{
	int stackin[]={1,2,3,4,5};
	//int stackout[]={4,5,3,2,1};
	int stackout[]={1,5,3,2,4};
	int lenin=sizeof(stackin);
	int lenout=sizeof(stackout);
	int A=IsLegal(stackin,stackout,lenin,lenout);
	if(A)
	{
		cout<<"出棧順序合法"<<endl;
	}
	else
	{
		cout<<"出戰順序不合法"<<endl;
	}
}
int main()
{
	TestStack();
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章