今天真的饱受折磨,不过最后感谢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");
}
}