成绩 | 10 | 开启时间 | 2021年09月24日 星期五 18:00 |
折扣 | 0.8 | 折扣时间 | 2021年10月10日 星期日 23:55 |
允许迟交 | 否 | 关闭时间 | 2021年10月17日 星期日 23:55 |
1.求解规定序列能否由入栈出栈操作得到
输入:有若干组数据输入
每组数据中,第一行为两个个整数 n 和 m。n 表示需要依次从 1~n 入栈,m 表示这组数据有 m 个出栈序列需要判断,当 n=0 且 m=0 时停止。
接下来有行,每行表示一个出栈序列
输出:对每一个出栈序列,如果能正常出栈,输出Yes,否则输出 No。
sample:
input:
5 2
1 2 3 4 5
5 4 1 2 3
6 1
6 5 4 3 2 1
0 0
output:
Yes
No
Yes
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
代码
这个原理书上我记得应该有,具体为什么是这个原理我也不是很懂,就当练习一下栈的使用了
栈
性质
总的来说就一句话,一个口进,一个口出,看下面例子
头文件
#include"stack"
using namespace std;//注意是C++的库
定义
stack<int>s;//<>里面是数据类型
进栈
s.push(x);//把x放进栈s里面
出栈
s.pop();//返回值是1或者0,代表出栈成功或者不成功,要是想得到栈顶的元素要用s.top()
判断栈是否为空
s.empty();//返回值是1则栈为空,返回0则栈非空
取栈顶元素
s.top();//返回值是栈顶元素,只是得到栈顶元素是什么,并不把它取出来
以上就是栈比较常用的方法,也是我们本次代码中会涉及到的
学长代码
#include"stdio.h"
#include"stack"
using namespace std;
int a[1010]={0},b[1010]={0};
int main(){
int n,m;
int flag=0;//\n
while(scanf("%d%d",&n,&m)!=0&&n+m){
if(flag==1){
printf("\n");
}
for(int i=1;i<=n;i++){
a[i]=i;
}
for(int j=0;j<m;j++){
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
stack<int>s;
int x=1,y=1;
while(y<=n){
if(a[x]==b[y]){
x++;
y++;
}
else if(!s.empty()&&s.top()==b[y]){
y++;
s.pop();
}
else if(x<=n){
s.push(a[x]);
x++;
}
else{
break;
}
}
if(s.empty()){
printf("Yes\n");
}
else{
printf("No\n");
}
}
flag=1;
}
}
我的代码
#include"stdio.h"
#include"stack"
using namespace std;
//有一个大数出栈,那么在这个大数之后出栈的比它小的数一定是逆序的,
//比如5出栈了,那么后面一定保证从大到小排序,比如4321
int main(){
int num2[100]={0};//输入
int num1[100]={0};//1~n
int n;//n 表示需要依次从 1~n 入栈
int m;//m 表示这组数据有 m 个出栈序列需要判断
while(1){
scanf("%d %d",&n,&m);
if(n==0&&m==0){
break;
}
for(int i=0;i<n;i++){
num1[i]=i+1;//1~n
}
while(m--){
stack<int>s;
for(int i=0;i<n;i++){
scanf("%d",&num2[i]);
}
int x=0,y=0;//num1和num2的下标
while(x<=n&&y<=n){
if(num1[x]==num2[y]){//如果相等,则跳过
x++;
y++;
}
else if(!s.empty()&&s.top()==num2[y]){//若栈非空且栈顶元素等于数组当前元素
s.pop();
y++;
//数组和栈顶元素相消
}
else{
s.push(num1[x]); //栈中加入当前元素
x++;
}
}
if(s.empty()){//最后都消没了
printf("Yes\n");
}
else{
printf("No\n");
}
}
printf("\n");
}
}
这道题难的是算法,就是为什么要用
while(y<=n){
if(a[x]==b[y]){
x++;
y++;
}
else if(!s.empty()&&s.top()==b[y]){
y++;
s.pop();
}
else if(x<=n){
s.push(a[x]);
x++;
}
else{
break;
}
}
的方法来判断,但我才疏学浅,没办法证明这个方法是对的,所以只能拾人牙慧,权当这题是一道coding题目,练练栈的使用
若有大佬能自己想到这个方法,那自然是最好