Pop Sequence(25 分)

Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M(the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

Sample Input:

5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

Sample Output:

YES
NO
NO
YES
NO

题目大意为给定一个入栈序列1,2,...,N,限定栈的大小为M,要求判断输出序列的合法性。编程小白的我开始想的是找出出栈序列有哪些特征,然后根据这些出栈序列的特征判断一个栈的合法性。

可是弄了半天,写出的程序又复杂又没有什么条理,也没用到栈结构,而且还通不过。。。明明想一想就能判别的东西,用程序写出来总不尽人意。 无奈上网搜了一下大神们的博客,顿

觉豁然开朗。这道题考察的其实就是堆栈的基本概念和操作。比如说 5 6 4 3 7 2 1这个序列,首先我们自然由第一个出栈元素为5,推测出5出栈前栈里面应该为5 4 3 2 1(5为栈顶元素)。然

后5出栈,这时根据第二个元素为6知道,栈应该是继续讲6入栈的,此时栈顶元素等于6,将6出栈。依次类推,只要比较栈顶元素和将要出栈的元素的大小,就可以知道该进栈还是出栈。当

然,若是出现栈顶元素大于将要出栈的元素,或者虽然栈顶元素小于将要出栈的栈顶元素但此时栈已满都说明这个将要出栈的元素是不可能出现的。因此可以判断该出栈序列不合法。以上就是

根据出栈序列,推测出栈和入栈操作的过程,关键是比较栈顶元素与“将要出栈元素”的大小。根据大神们的博客的思路再结合自己的理解自己独立地(就是没有边看边写^_^)写出了如下的代码。

 #include<stdio.h>
#include<stdlib.h> typedef struct Node { //c语言栈基本结构的构造
int *Data;
int Top;
int MaxSize;
}*Stack; int M, N, K; //全局变量,放在栈结构后,方便子函数使用 Stack CreateStack(int MaxSize) {
Stack S = (Stack)malloc(sizeof(struct Node));
S->Data = (int *)malloc(MaxSize * sizeof(int));
S->Top = -;
S->MaxSize = MaxSize;
return S;
} void Push(Stack S, int ele) {
if (S->Top == S->MaxSize) { //短路写法,遇错就返回,提高程序可读性
printf("FULL\n");
return;
}
S->Data[++(S->Top)] = ele;
} void Pop(Stack S) {
if (S->Top == -) {
printf("Empty\n");
return;
}
S->Top--;
} int top(Stack S) { //返回栈顶元素
return S->Data[S->Top];
} int StackCheck(int *v,Stack S) { //检查输出序列是否为容量为M的栈输出序列
int idx = ; //数组v的指标,指向下一个将要出栈的元素
int num = ; //按顺序进栈的元素,进栈自动加1
S->Top = -;
while (idx != N) {
while (S->Top != - && top(S)<v[idx]&&S->Top+<M||S->Top==-&&idx!=N) {
Push(S, num++); //若栈非空且栈顶元素小于将要比较的出栈元素或者栈为空且idx未滑至N(即出栈序列未比较完成)
}
if (S->Top!=-&&top(S) == v[idx]) { //栈非空且栈顶元素值等于将要比较的出栈元素
Pop(S);
idx++;
}
if (S->Top != -&&top(S)>v[idx]|| S->Top + == M&&top(S) != v[idx]) { //栈非空且栈顶元素大于将要比较的出栈元素或栈满但栈顶元素仍小于将要比较的出栈元素
return ; //直接返回,使程序更易理解
}
} return ;
} int main() {
int i, j;
Stack S; scanf("%d %d %d", &M, &N, &K);
int *v = (int *)malloc(N * sizeof(int));
S = CreateStack(M);
for (i = ;i < K;i++) {
for (j = ;j < N;j++) {
scanf("%d", v + j);
}
if (StackCheck(v, S))
printf("YES\n");
else
printf("NO\n");
} }

随机推荐

  1. 在ASP.NET MVC应用程序中随机获取一个字符串

    在开发ASP.NET MVC应用程序时,有可能需要一个随机字符串,作为密码或是验证码等. 如果你需要的是SQL版本,可以参考<密码需要带特殊字符(二)>http://www.cnblogs ...

  2. 联想拯救者ISK代开BIOS的方法

    按f几都没用,摁fn+f几也不会有用,ISK需要使用物理疗法

  3. JavaSE Collection集合

    集合:是java中提供的一种容器,可以用来存储多个对象.可是我们前面学习的数组也是可以保存多个对象的,为什么还要提供集合容器呢?集合和数组它们有啥区别呢? 数组的长度是固定的.一旦创建完成不能改变长度 ...

  4. mahout 使用

    最近在做mahout源码调用的时候,发现一个参数:startPhase和endPhase,这两个参数是什么意思呢?比如运行RecommenderJob时,可以看到10个MR任务,所以猜测是否是一个ph ...

  5. hive 中的正则表达式

    背景: 前几天拿来apache日志,用hive的正则进行匹配,发现匹配出来的字段算是NULL,但是我用RegexBuddy工具显示能够匹配的到啊!例子如下(我拿正常的apache日志来比较,我的apa ...

  6. BCB 读写Word文档

    void __fastcall TForm1::btn1Click(TObject *Sender) { Variant WordApp,WordDocs,WordDoc; Variant word_ ...

  7. 【奇技淫巧】绕过waf写文件

    今天偶然利用此命令干成了大事,老司机一看就懂命令用法百度搜到的,希望对各位表哥有用echo 48 65 6C 6C 6F 2C 57 6F 72 6C 64 21 >hex.txt::生成 he ...

  8. python的变量以及常量介绍

    变量概念: 把程序运行过程中产生的中间值保存在内存. 方便后面使用. 命名规范: 1. 数字, 字母, 下划线组成 2. 不能数字开头, 更不能是纯数字 3. 不能用关键字 4. 不要用中文 5. 要 ...

  9. 【代码笔记】iOS-可拷贝的label

    一,效果图. 二,工程图. 三,代码. ViewController.m #import "ViewController.h" #import "MKBeCopyLabe ...

  10. struts2、ajax实现前后端交互

    跳过struts2环境搭建部分,或者可以看我的博客(http://www.cnblogs.com/zhangky/p/8436472.html),里面有写,很详细. 需要导入的jar包(struts官 ...