元素出栈,入栈顺序的合法性。如入栈的序列(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个序列是不匹配的。

下面用图说明

开始栈为空

入栈序列第一个元素入栈后,栈顶元素不等于出栈序列第一个元素,而且入栈序列不为空,继续入栈。

元素等于出栈序列首元素,执行出栈操作,4出栈

出栈序列指针指向后一位

判断当前栈顶元素是否等于出栈序列首位元素,且入栈序列不为空,如果不等于,继续入栈,如果等于,进行出栈操作。图中相等,所以5入栈。

当入栈序列为空时,栈顶元素等于dest,就执行出栈操作,在出栈过程中,如果栈顶元素一直等于dest,直到出栈序列为空,说明匹配,如果在出栈过程中,栈顶元素有和dest不相等的,说明匹配失败。

实现代码:

#include <iostream>

#include<string>

using namespace std;

#define MAX 10

template <class T>

class Stack

{

public:

//构造函数

Stack()

:_top(-1)

, _capatity( MAX)

, _stack( new T [_capatity])

{}

//析构函数

~Stack()

{

if (_stack)

{

delete[] _stack;

}

}

//插入数据

void Push(const T& x)

{

//检查栈是否已满

if (_top >= _capatity)

{

return;

}

_stack[++_top] = x;//这里必须是前置++,因为你的初始值为-1

}

//删除数据

T Pop()

{

//检查栈是否为空

if (_top == -1)

{

return -1;

}

return _stack[_top--];//这里必须是后置--,如果是前置--,就取不到栈顶元素

}

//返回栈顶元素

T Top()

{

if (_top == -1)

{

return -1;

}

return _stack[_top];

}

T Empty()const

{

return _top == -1;

}

private:

int _top;//栈顶数据

int _capatity;//栈可容纳的元素

T* _stack;//顺序栈

};

//检查合法性

int  IsLegal(char * source, char* dest )

{

Stack<char > s;

if (strlen(source ) != strlen(dest))

{

return -1;

}

s.Push(* source++);//第一个元素入栈

while (*dest )

{

while (*dest != s.Top() && *source)

{

s.Push(* source++);

}

if (*dest == s.Top())

{

s.Pop();

dest++;

continue;

}

else if (*dest != s.Top() && * source == ‘\0‘ )

{

return -1;

}

else

{

s.Push(* source++);

}

}

return 0;

}

void Test()

{

Stack<int > s;

cout << s.Empty() << endl; //这里会返回1,因为编译器会把-1当成无符号数处理

s.Push(1);

s.Push(2);

s.Push(3);

s.Push(4);

while (!s.Empty())

{

cout << s.Pop() << " ";

}

cout << endl;

}

int main()

{

Test();

/*char *str = "12345";

char *arr = "45213";

int ret = IsLegal(str, arr);

if (ret == 0)

{

cout << "Legal" << endl;

}

else

{

cout << "No_Legal" << endl;

}*/

system( "pause");

return 0;

}

时间: 2024-12-16 19:34:54

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

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

问题:元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,1,2) 定义一个栈sp,入栈序列为str1,出栈序列为str2,长度分别为size1和size2.如果两个序列为空或长度不等,则不合法,针对长度相等且不为空的两个序列进行判断. 先将str1中第一个元素入栈,然后通过循环使str1后移. 1.如果当前栈为空且入栈序列不为空,则入栈序列str1后移,sp入栈. 2.如果栈顶元素不等于出栈序列且入栈序列不为空,则入栈序列str1后移,sp入栈. 3.如果栈

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

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

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1.2.3.4.5,那么4.5.3.2.1 就有可能是一个pop 系列,但序列4.3.5.1.2 就不可能是push 序列1.2.3.4.5 的pop 序列. 分析: 我们首先定义遍历push的序数i=0  遍历pop序列的序数 j =0 我们可以先遍历给出的push序列,并且时刻与pop序列的头元素p

栈基本操作(顺序栈)

#include<iostream> #include<cstdlib> using namespace std; //定义初始化长度和每次增加的长度 const int STACK_INIT_SIZE=10; const int STACK_INCREAMENT=2; struct Stack{ int* base; //栈底 int* top; //栈顶 int stacksize; //已分配栈的大小 }; //函数声明 void show();//主界面 void Init

栈的的顺序实例SeqStack实现

1.#include <stdio.h>#include <stdlib.h>#include "SeqStack.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) {    SeqStack* stack = SeqSt

定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数:然后按顺序每五个数求出一个平均值,放在另一个数组中并输出. var arr = []; var NewArr = []