这道题目考察的就是栈的先进后出(FILO),当第一个值压入栈后,它就会比它后压入的值晚出栈,好比1.2.3.4.5是入栈序列,4.5.3.2.1是出栈序列,为什么说他是正确的呢?因为当4出栈时,栈内已经压入1.2.3,5还没有压入,4先压入,在直接出栈,然后5再进栈再出栈,然后3.2.1依次出栈,那么在程序里该怎么实现呢,用代码直接展示吧。
#include<iostream>
#include <assert.h>
#include <stack>
using namespace std;
bool Check(int *stack_in, int *stack_out, int len_in, int len_out)
{
assert(stack_in && stack_out);
if (len_in != len_out) //两个序列长度不相等,不合法
return false;
stack<int> s;
int j = 0;
int i = 0;
for (; i < len_in; i++)
{
s.push(stack_in[i]);
while (s.size() > 0 && s.top() == stack_out[j])//入栈序列栈顶元素与当前出栈序列元素不相等,不合法
{
s.pop();
j++;
}
}
return (s.size()>0) ? false : true; //当所有出栈序列元素都匹配完之后,栈不为空,不合法
}
int main()
{
int stack_in[] = { 1, 2, 3, 4, 5 }; //入栈序列
int stack_out[] = { 4, 5, 3, 2, 1 }; //出栈序列
int len_in = sizeof(stack_in) / sizeof(stack_in[0]); //入栈序列长度
int len_out = sizeof(stack_out) / sizeof(stack_out[0]); //出栈序列长度
bool ret = Check(stack_in, stack_out, len_in, len_out);
if (ret)
cout << "出栈顺序合法" << endl;
else
cout << "出栈顺序不合法" << endl;
system("pause");
return 0;
}