每日总结(2021/12/15)

今天真的饱受折磨,不过最后感谢lzl学长和我的同学,我终于解决了那几道让我几度想拆电脑的题。

第一道:这道题的格式让我头疼,同时一点思路也没有,还好我同学点拨了一下。

现在有n个元素分别是1,2,3,...,n,我们想知道通过一个栈,在n次push/pop后,出栈序列可能是什么样的。例如n是5,那么入栈次序就是1,2,3,4,5,如果我们希望出栈次序同样是1,2,3,4,5,那只要每push一个数,就立即pop一个数。如果我们希望出栈次序是3,2,4,5,1,那么我们先让1,2,3入栈,然后pop出来3和2,接着4入栈后马上pop,再就是5入栈后马上pop,最后再把栈里的1pop出。再例如,如果我们希望出栈次序是5,4,1,2,3,这是办不到的,如果要让5最先出栈,那么出栈次序只可能是5,4,3,2,1
 

Input

输入由多块输入构成,每块的第一行是n,(1≤n≤1000),接着是多组测试数据,每组一行,每行由n个1到n的整数组成,直到某一行第一个数是0表示此输入块结束,然后是下一块数据。

当某一块的第一行的n是0的时候结束所有输入

Output

对每组数据,只要输出Yes或No,Yes表示能产生那样的出栈序列,No表示不能。 输入块与输入块之间要多输出一个空行分隔。注意对于最后一个n为0的输入块不要多输出空行。

Sample Input

5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0

Sample Output

Yes
No

Yes
#include<stdio.h>

void push(int n,int a[])
{
    int j=1,top=0,w[2000]= {0};
    for(int i=0; i<n; i++)
    {
        if(w[top]!=a[i])//如果栈顶不是a[i]
        {
            for(; j<=a[i]; j++)//直接把top加到a[i]
            {
                top++;
                w[top]=j;
            }
        }
        if(w[top]==a[i])//如果栈顶是a[i]
            top--;//就让栈顶下滑一个
    }
    if(top==0)
        printf("Yes\n");//到最后看栈顶是否为0
    else
        printf("No\n");
}
int main()
{
    int n;//输入格式(让人无语)
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            return 0;
        else
        {
            for(int o=0;; o++)
            {
                int a[2000];
                for(int i=0; i<n; i++)
                {
                    scanf("%d",&a[i]);
                    if(a[i]==0)
                        break;
                }
                if(a[0]==0)
                {
                    printf("\n");
                    break;
                }
                push(n,a);//调用函数判断是否能输出该数列
            }
        }
    }
    return 0;
}

关于判断一个数列是否能合法按栈的方式输出,我这还有一个简单方法,是关于出栈的数学规律;XDOJ_305 判断堆栈出栈序列是否有效 C语言描述_m0_46951573的博客-CSDN博客详情可以看这里,我先把代码码出来,是真的巧妙,省了挺多麻烦的。

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
int main(){
	int i,j,n;
	int a[MAXSIZE];
	int key;
	scanf("%d", &n);
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	//利用出栈顺序的规律 
	for(i=0; i<n; i++){
		key = a[i];
		for(j=i+1; j<n; j++){	//判断该下标之后比它小的数是不是按递减顺序排列 
			if( a[i]>a[j] ){
				if(key < a[j]){
					printf("no");
					return 0;
				}else{
					key = a[j];
				}
			}
		}
	}
	printf("yes");
	return 0;
}

再来一道很简单的题目,反正我是一遍过

宇神完成了栈的实验要求后,他又很是开心,刚要出去五排, 菌菌子突然问道老师让做的队列的那个实验你写完了么,宇神顿时大呼悲哉。。。。他给忘记了,怎么办。。明天就要上交实验报告了,你能帮他搞定么???

你需要完成三种操作1.enqueue x,将元素x插入队尾。2.dequeue,若队列非空,则删去队头元素,并输出该元素。3.query,从队头开始删除所有元素,并输出。

Input

本题有多组测试数据,每组数据首先输入一个T,接下来T行是T种对队列的操作。  (0< T < 100,0< x <= 500)

Output

每次执行dequeue操作时删除队头元素输出并换行,如果队列为空输出“this is empty!”并换行。

每次执行query操作时删除所有元素队列内所有元素并输出,每个元素占一行,如果栈为空输出“this is empty!”并换行。

每组数据后有一个空行。

Sample Input

10
enqueue 1
enqueue 2
enqueue 3
enqueue 4
query
dequeue
enqueue 1
dequeue
query
dequeue
#include<stdio.h>
#include<string.h>
int Q[200];
int back,front,num;
char a[10];
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
	for(int i=0;i<n;i++)
	{
		scanf("%s",a);
		if(a[0]=='e')	
		{
			scanf("%d",&num);
			Q[back++]=num;
		}
		else if(a[0]=='q')
		{
			if(back==front)
				printf("this is empty!\n");
			else
			{
				for(int j=front;j<back;j++)
			{
				printf("%d\n",Q[j]);
				Q[j]=0;
			}
			 back=0;
			 front=0;
			}
			
		}
		else 
		{
			if(back==front)
				printf("this is empty!\n");
			else
				printf("%d\n",Q[front++]);
		}
	}
	    for(int i=0;i<back;i++)
	    Q[i]=0;
	    back=0;
	    front=0;
	    printf("\n");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值