判断元素入栈,出栈顺序的合法性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33417547/article/details/52561667

题目要求元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)合法,入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,1,2)不合法。


定义一个栈s,入栈序列为stack_in,出栈序列为stack_out,长度分别为len_in和len_out。如果两个序列为空或长度不等,则不合法,出栈序列和入栈序列必须长度相等且不为空才能进行判断。

先将stack_in中第一个元素入栈,然后通过循环使stack_in后移。

如果当前栈为空且入栈序列不为空,则入栈序列stack_in后移,s入栈。

如果栈顶元素不等于出栈序列元素且入栈序列不为空,则入栈序列stack_in后移,s入栈。

如果栈顶元素等于出栈序列元素,s出栈,出栈序列stack_out后移。

循环比较后,如果栈为空,则出栈序列是合法的,否侧不合法。


下面是代码实现:

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

bool Check(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 j = 0;
	int i = 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_in[0]);      //入栈序列长度
	int len_out = sizeof(stack_out) / sizeof(stack_out[0]);   //出栈序列长度
	bool ret = Check(stack_in, stack_out,len_in,len_out);
	if (ret)
		cout << "出栈顺序合法" << endl;
	else
		cout << "出栈顺序不合法" << endl;
	system("pause");
	return 0;</strong>
结果:

展开阅读全文

没有更多推荐了,返回首页