题目

思路
根据栈的特性不难发现
当你第一个数字是大数的时候,他前面的数已经存放进栈里了
如第一个数字是3,那么1,2已经在3的前面了
后续有两种可能
1)第二个数字比3小,但这个数只能小于1,否则是非法的
2)第二个数字比3大,比如6,这个时候3已经出来了,我们再往内压入4,5,6
3)后续出栈会出现断开的情况(4和2),这个时候我们还是得依靠栈的top来进行验证是否合格
代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for(int z = 0; z < n; z++)
{
int arr[10];
int size = 0;
int up;
cin >> up;
string s;
cin >> s;
int max = 0;
int l = s.length();
for(int i = 0; i < l; i++)
{
if(max < (s[i] - '0'))//max比下一个要出的小,那么对应中间部分要全部压进去,然后out一个
{
for(int j = max + 1; j <= (s[i] - '0'); j++)
{
arr[size++] = j;
}
max = s[i] - '0';
}
if(arr[size - 1] == (s[i] - '0'))
{
size--;
}
else
{
cout << "no" << endl;
goto FLAG;
}
}
cout << "yes" << endl;
FLAG:;
}
}
本文介绍了一种基于栈的操作模拟算法,通过分析输入序列来判断是否可以通过一系列合法的入栈和出栈操作得到该序列。文章详细解释了算法的实现过程,并提供了完整的C++代码示例。
1237

被折叠的 条评论
为什么被折叠?



