判断出栈顺序的合法性(面试题)

 判断出栈顺序的合法性

      ”栈“是一种限制性线性表,是将线性表的插入、删除操作限制为仅在表的一端进行,一般将能够插入、删除的一端称为栈顶,表的另一端称为栈底。当栈中没有元素时称为空栈。即就是将每次进栈的元素放在栈顶元素之上而称为新的栈顶,而每次出栈的是当前栈中“最新”的元素。因此就需要对一些出栈顺序的合法性进行判断。这个也是面试会经常问到的问题。


◆主要思路:

       首先,需要一个栈s,给定两个序列,先将入栈序列的第一个数据与出栈序列的第一个数据相比较,若两个数据相同,再次将入栈序列的第二个数据和出栈序列的第二个数据进行比较,若两个数据不相同将入栈序列中的第一个数据压入s栈中,再次比较入栈序列的第二个数据和出战序列的第一个数据,若相同则继续比较两个序列中的下一个数据,若不相同再将入栈序列的第二个数据压入栈s中,同时重复执行上述的操作比较两个数据。当入栈序列遍历完成后,栈s为空,则出栈序列的顺序是合理的,否则,就是不合理的。

     

      下面是简要的图示:



wKiom1cQ6KaT48OnAAAXKdFGzj8961.png


下面是具体的程序代码:


//判断出栈、入栈的合法性?
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <assert.h>
#include <stack>

template<class T>
class IsLegal
{
public:
    IsLegal(const T* s1, const T* s2)    //构造函数
       :str1(new T[strlen(s1)])
       , str2(new T[strlen(s2)])
    {
        strcpy(str1, s1);
        strcpy(str2, s2);
    }
 
    ~IsLegal()      //析构函数
    {
        if (str1 != NULL)
       {
           delete str1;
        }
        if (str2 != NULL)
       {
           delete str2;
        }
    } 
    
public:
    void judge(const T* str1, const T* str2)
    {
        assert(str1);
        assert(str2);
        stack<T> s1;
        while (*str1 != '\0')
       {
           if (*str1 != *str2)
           {
               s1.push(*str1);
               str1++;
            }
           else if (*str1 == *str2)
           {
               s1.push(*str1);
               while (!s1.empty())
              {
                  if (s1.top() != *str2)         //防止情况12345——43565
                 {
                     break;
                 }
                 s1.pop();
                 str2++;
               }
               str1++;
               str2++;
            }
        }
        if (*str2 == '\0')
       {
           cout << "This is legal." << endl;
        }
        else
       {
           cout << "This is unlegal." << endl;
        }
    }
    
private:
    T* str1;
    T* str2;
};

int main()
{
    char* str1 = "12345";
    char* str2 = "45321";
    
    IsLegal<char> s(str1, str2);
    s.judge(str1, str2);
    
    system("pause");
    return 0;
}



本文出自 “无心的执着” 博客,谢绝转载!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值