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

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

定义一个栈sp,入栈序列为str1,出栈序列为str2,长度分别为size1和size2。如果两个序列为空或长度不等,则不合法,针对长度相等且不为空的两个序列进行判断。

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

1、如果当前栈为空且入栈序列不为空,则入栈序列str1后移,sp入栈。

2、如果栈顶元素不等于出栈序列且入栈序列不为空,则入栈序列str1后移,sp入栈。

3、如果栈顶元素等于出栈序列,sp出栈,出栈序列str2后移。

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

下面以入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,1,2)为例进行说明。

利用模板实现对象OutStack,可以判断不同类型元素出栈,入栈顺序的合法性,具体实现如下:

#include<iostream>
using namespace std;
#include<stack>
#include<string>
template<class T>
class OutStack
{
public:
	OutStack();
	OutStack(const T* str1, const T* str2, size_t size1, size_t size2);
	~OutStack();
	bool OutStack::Legality();
private:
	T* _str1;
	T* _str2;
	size_t _size1;
	size_t _size2;
};
template<class T>
OutStack<T>::OutStack()
:_str1[NULL]
, _str2[NULL]
, sp(NULL)
{}
template<class T>
OutStack<T>::OutStack(const T* str1, const T* str2, size_t size1, size_t size2)
: _str1(new T[size1])
, _str2(new T[size2])
, _size1(size1)
, _size2(size2)
{
	memcpy(_str1, str1,(sizeof(T)*_size1));//memcpy按照字节数进行复制的
	memcpy(_str2 ,str2,(sizeof(T)*_size2));
}
template<class T>
OutStack<T>::~OutStack()
{
	if (_str1 || _str2)
	{
		delete[] _str1;
		delete[] _str2;
	}
}
template<class T>
bool OutStack<T>::Legality()
{
	T* str1 = _str1;//入栈序列
	T* str2 = _str2;//出栈序列
	stack<T> sp;
	if (str1 && str2 && _size1 != _size2)
		return 0;
	sp.push(*str1);//先将str1中第一个元素入栈
	for (size_t i = 0; i < _size1;)//将出栈序列比较完
	{
		if (*str1 != NULL && sp.empty())
		{
			str1++;
			sp.push(*str1);
			i++;//i和str1同步进行,直到str1进行完
		}
		if (*str1 != NULL && sp.top() != *str2)//栈顶元素与出栈元素比较
		{
			str1++;
			sp.push(*str1);
			i++;//i和str1同步进行,直到str1进行完
		}
		if (sp.top() == *str2)
		{
			sp.pop();
			str2++;
		}
	}
	if (sp.empty())//如果栈为空,则出栈序列是合法的
	{
		return 1;
	}
	return 0;
}

测试用例如下:

void Test1()
{
	int arr1[] = { 1, 2, 3, 4, 5 };//入栈序列
	int str1[] = { 4, 5, 3, 1, 2 };//出栈序列
	//int str1[] = { 3, 2, 1, 5, 4 };//出栈序列
	OutStack<int> s1(arr1, str1, 5, 5);
	cout << s1.Legality() << endl;

	char* arr2 = "abcdef";//入栈序列
	//char* str2 = "bafdce";//出栈序列
	char* str2 = "baefdc";//出栈序列
	OutStack<char> s2(arr2, str2, 6, 6);
	cout << s2.Legality() << endl;
}
时间: 2024-10-12 11:54:11

判断元素出栈,入栈顺序的合法性的相关文章

出栈入栈动画demo

项目做了一个切换界面动画的功能,用到了出栈入栈的,写了一个demo package com.myron.stackview; import java.util.Stack; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation;

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

输入两个整数序列,第一个整数序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列??? 解决该问题很直观的想法就是建立一个辅助栈,根据弹出序列知第一个希望被弹出的数字为X,由于压入栈的顺序由压栈序列确定,所以此时应该把压入序列中X之前的 数字都依次压人到辅助栈里面去.如果下一个被弹出的数字刚好是栈顶数字,那么直接将其弹出,如果下一个弹出的数字不在栈顶,我们则把压栈序列中还没有入栈的数字(并且在该弹出数字之前的数字)压入辅助栈,如果所有的压栈序列中数字都遍历了仍然没有找到下一个弹出的数字,那

xtu 1035 与xtu 1036 两道出栈入栈题目,蛮有趣的

Description John是个小列车站的站长,每次列车在这里重新编组时他就很烦恼.因为站上只有一个人字形的编组轨道(如图),所有的列车车厢都是从人字轨的右边依次进去,从左边出来.但有一些编组顺序John总编不出来,John怀疑有些编组顺序是不可能完成的,可John又找不出那些是顺序是可以编组出,那些不可以.请你写一个程序帮助John辨别哪些编组可以完成,哪些不能完成. 输入: 第一行是一个整数K,表示有多少个测试用例,以后每行一个测试用例,每行为n+1个整数,第一个整数为n 表示有多少节车

C++中栈的出栈,入栈规则:A,B,C,D,E

考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CDABE   d.  DCBEA 分析: 1.假定进栈序列是从小到大排练的(即A<B<C<D<E),则出栈序列中不可能有  “大小中”这种序列,因为在“大数”出栈后,在栈中“中数”是在“小数”上面的,所以只能是先出“中数”再出“小数”2.出栈序列中如包含下列序列则是错误的:CAB,DAB

原生js如何判断元素出现在可视区

元素出现在可视区 scorll滑动的距离>=当前元素距离浏览器最顶端的高度+当前元素自身的高度-当前可视区的高度 触底 scorll滑动的距离>=当前scroll总高度-当前可视区的高度 原文地址:https://www.cnblogs.com/wuqilang/p/11253618.html

职责链 评价:挺好玩的 稍微复杂版 类似出栈入栈 (原理职责链调用一个之后跳转到第二个执行在跳转第三个执行 接下来因为每次调用完后都会返回被调用的位置)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplication20{    public class Response    {        public string ResponseStr { get; set; }                     } public class Request    {        pub

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名 代码如下: #i

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

元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5).出栈序列为(4,5,3,2,1) 思路: 1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈: 2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空. 3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走: 4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的. 下面用图说明 开始栈为空 入栈序列第一个元素入栈后

C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋值*/ #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define OK 1#define ERROR 0#define NAMESIZE 255//字符串的最大长度