元素出栈、入栈顺序的合法性
元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。
算法思想:
建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈中,并按照第二个序列依次从该栈弹出数字。
入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),此时为合法弹出。
步骤
|
操作
|
栈
|
弹出数字
|
步骤
|
操作
|
栈
|
弹出数字
|
1
|
压入1
|
1
|
|
6
|
压入5
|
1,2,3,5
|
|
2
|
压入2
|
1,2
|
|
7
|
弹出
|
1,2,3
|
5
|
3
|
压入3
|
1,2,3
|
|
8
|
弹出
|
1,2
|
3
|
4
|
压入4
|
1,2,3,4
|
|
9
|
弹出
|
1,
|
2
|
5
|
弹出
|
1,2,3
|
4
|
10
|
弹出
|
|
1
|
入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),此时弹出顺序不合法。
步骤
|
操作
|
栈
|
弹出数字
|
步骤
|
操作
|
栈
|
弹出数字
|
1
|
压入1
|
1
|
|
6
|
压入5
|
1,2,3,5
|
|
2
|
压入2
|
1,2
|
|
7
|
弹出
|
1,2,3
|
5
|
3
|
压入3
|
1,2,3
|
|
8
|
无法操作
|
|
|
4
|
压入4
|
1,2,3,4
|
|
|
|
|
|
5
|
弹出
|
1,2,3
|
4
|
| |
步骤8无法进行的原因是:下一个需要弹出2,但2不在栈顶,压栈序列的数字都已经入栈。操作无法继续,即该弹出序列不合法。
代码实现:
#include
#include
using namespace std;
template
class Stack
{
public:
Stack()
:_str1(NULL)
, _str2(NULL)
{}
~Stack()
{
if (_str1 != NULL)
{
delete[] _str1;
}
if (_str2 != NULL)
{
delete[] _str2;
}
}
bool IsPopOrder(const char* Push, const char* Pop, int Pushlength, int Poplength)
{
if (Push == NULL || Pop == NULL||(Pushlength!=Poplength))
{
cout << "不合法" << endl;
return false;
}
stack
sc;
while (*Push)
{
if (sc.size() == 0 || sc.top()!=*Pop)
{
sc.push(*Push++);
}
else
{
sc.pop();
++Pop;
}
}
while (sc.size())
{
if (sc.top() != *Pop++)
{
cout << "不合法" << endl;
return false;
}
sc.pop();
}
cout << "合法" << endl;
return true;
}
protected:
char* _str1;
char* _str2;
};
void Test1()
{
char* str1 = "12345";
char* str2 = "45321";
Stack
s; s.IsPopOrder(str1, str2, 6, 6); } void Test2() { char* str1 = "12345"; char* str2 = "45231"; Stack
s; s.IsPopOrder(str1, str2, 6, 6); }
测试结果: