#include<iostream>
#include<stack>
using namespace std;
int main()
{
char a[] = { "abcdefg" };
stack<char>s;
int k = 0;
char c;
while (k < 7) {
cin >> c;
if (!s.empty() && c < s.top())break;
while (s.empty() || c != s.top()) {
s.push(a[k++]);
}
if (c == s.top())s.pop();
if (k == 7) {
if (s.empty())goto label;
while (cin >> c) {
if (c != s.top())goto label;
else s.pop();
if (s.empty())goto label;
}
}
}
label:
if (!s.empty())cout << "Fasle" ;
else cout << "True" ;
}
平台总是有一个数据不给过,手动测试的数据都已通过,实在是崩溃了
说一下思路:如果栈为空或者输入的字符不等于栈顶字符就一直按abcdefg序列进栈,如果输入的字符等于栈顶字符就出栈,
当k==7就是七个字符均已进栈之后就判断每次输入的字符是否与栈顶指针相同即可,一旦不同就输出false,直到栈空。
我希望有人能找出代码中存在的漏洞,甚至提供一种更简洁的代码或思路,毕竟用了好多goto
如果永远先入先出,那么就没这个题了,因为不管什么时间出栈,都不改变顺序,所以永远是abcdefg
但是栈是先入后出的,那么不同时间出栈将造成顺序改变
比如a刚进来就出去,那么a就排第一个了
如果先入了a,b,然后都出来,前面就变成了b,a
如果b出来之后又入了c,那么会先出c,最终是b,c,a
但是绝对不可能先出c,再a,最后b
观察规律
其实就是先列出abcdefg,从任意位置开始输出,如果要输出它右边的字符,可以跳过任意字符输出,如果要输出左边字符,则必须按顺序输出
只要输出满足这个规律就是正确的,不满足就是错误的