题目描述
PIPI现有a-z 26个小球模拟出入栈操作,小球按照a~z的顺序压入栈,在栈顶的元素可以随时被取出,在游戏开始前给出任意26个字母的一些排列,问是否能够由出栈顺序得到这个排列。
输入
输入包含多组测试用例。
每组测试用例包含26个字母组成的一个序列。
输出
若出栈顺序合法,输出"yes",否则输出"no".
样例输入
abcdefghijklmnopqrstuvwxyz
zabcdefghijklmnopqrstuvwxy
样例输出
yes
no
前导知识
快速判断出栈序列是否合法
① 情况1:入栈的顺序是降序排列,判断依据:任意数A的后面比A大的数都是按照升序排列的。
例题:有六个元素{6,5,4,3,2,1},按照该顺序入栈,那么以下哪一个是不合法的出栈顺序(C).
A) 543612
B) 453126
C) 346521(不合法)
D) 234156
② 情况2:入栈顺序是升序排列,判断依据:任意数A后面比A小的数都是按照降序排列的。
例题:有六个元素{1,2,3,4,5,6},按照该顺序入栈,那么543216和542136(不合法)哪个是合法的出栈序列?
代码实现
#include<iostream>
#include<cstring>
using namespace std;
string s;
char a[26][26];
char minn[26];
int main()
{
while(cin>>s){
bool flag = true;
for(int i=0;i<25;i++){
a[i][0] = s[i];
int pos = 1;
minn[i] = s[i];
for(int j=i+1;j<26;j++){
if(s[j]<s[i]){
a[i][pos++] = s[j];
if(a[i][pos-1]>a[i][pos-2]) flag = false;
}
}
}
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}