9. 出栈序列

成绩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以文本方式显示
  1. 5 2 ↵
  2. 1 2 3 4 5 ↵
  3. 5 4 1 2 3 ↵
  4. 6 2 ↵
  5. 6 5 4 3 2 1 ↵
  6. 3 2 5 6 4 1 ↵
  7. 0 0 ↵
以文本方式显示
  1. Yes↵
  2. No↵
  3. Yes↵
  4. Yes↵
无限制64M0

 代码

这个原理书上我记得应该有,具体为什么是这个原理我也不是很懂,就当练习一下栈的使用了

性质

总的来说就一句话,一个口进,一个口出,看下面例子

 

头文件

#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题目,练练栈的使用

若有大佬能自己想到这个方法,那自然是最好

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值