温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-06-25 11:19:04 来源:网络 阅读:2059 作者:清幽宁 栏目:编程语言

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

思路:

1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈;

2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空。

3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走;

4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的。

下面用图说明

开始栈为空

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

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

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

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

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

出栈序列指针指向后一位

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

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

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

当入栈序列为空时,栈顶元素等于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;

}



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI