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