判断出栈顺序的合法性
”栈“是一种限制性线性表,是将线性表的插入、删除操作限制为仅在表的一端进行,一般将能够插入、删除的一端称为栈顶,表的另一端称为栈底。当栈中没有元素时称为空栈。即就是将每次进栈的元素放在栈顶元素之上而称为新的栈顶,而每次出栈的是当前栈中“最新”的元素。因此就需要对一些出栈顺序的合法性进行判断。这个也是面试会经常问到的问题。
◆主要思路:
首先,需要一个栈s,给定两个序列,先将入栈序列的第一个数据与出栈序列的第一个数据相比较,若两个数据相同,再次将入栈序列的第二个数据和出栈序列的第二个数据进行比较,若两个数据不相同将入栈序列中的第一个数据压入s栈中,再次比较入栈序列的第二个数据和出战序列的第一个数据,若相同则继续比较两个序列中的下一个数据,若不相同再将入栈序列的第二个数据压入栈s中,同时重复执行上述的操作比较两个数据。当入栈序列遍历完成后,栈s为空,则出栈序列的顺序是合理的,否则,就是不合理的。
下面是简要的图示:
下面是具体的程序代码:
//判断出栈、入栈的合法性?
#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;
}
本文出自 “无心的执着” 博客,谢绝转载!