1. 程式人生 > >判斷元素入棧出棧的合法性

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

       給出的入棧序列為(1,2,3,4,5),出棧序列為(4,5,3,2,1)則為合法;出棧序列為(4,5,3,1,2)則為不合法。

解題思路:

1)我們可以用陣列來進行儲存入棧和出棧的序列,一個數組村的是入棧的序列另一個數組村的是出棧的序列。

2)用一個輔助棧,將入棧序列的第一個元素壓棧,看是否和出棧序列的第一個元素相等。

3)如果相等則將輔助棧中的元素彈出去,繼續比較入棧序列的下一個元素和出棧序列的下一個元素是否相等。

4)如果不相等繼續將下一個入棧序列的元素壓棧並且判斷它是否與出棧序列中的當前元素匹配

若入棧序列遍歷完畢,輔助棧為空 說明入棧序列中的元素和出棧序列中的元素匹配,返回true

若輔助棧不為空的話,說明不匹配,返回false

程式碼如下:

#include<iostream>
using namespace std;
#include<assert.h>
#include<stack>

bool StackCheck(int* stack_in,int* stack_out,int len_in,int len_out)
{
	assert(stack_in && stack_out);//入棧處出棧序列都不為空
	if(len_in != len_out)
	{
		return false;
	}
	stack<int> s;
	int i = 0;
	int j = 0;
	for(;i < len_in;i++)
	{
		s.push(stack_in[i]);
		while(s.size() > 0 && s.top() == stack_out[j])//棧頂元素不等於出棧的元素就不合法
		{
			s.pop();
			j++;
		}
	}
	return s.size() > 0 ? false: true;
}

int main()
{
	int stack_in[] = {1,2,3,4,5};
	int stack_out[] = {4,5,3,2,1};
	int len_in = sizeof(stack_in)/sizeof(stack_out[0]);
	int len_out = sizeof(stack_out)/sizeof(stack_out[0]);
	int ret = StackCheck(stack_in,stack_out,len_in,len_out);
	if(ret)
		cout<<"出棧順序合法!"<<endl;
	else
		cout<<"出棧順序不合法!"<<endl;
	return 0;
}