习题3.9 堆栈操作合法性

假设以SX分别表示入栈和出栈操作。如果根据一个仅由SX构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入SX序列,判断该序列是否合法。

输入格式:

输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由SX构成的序列。序列保证不为空,且长度不超过100。

输出格式:

对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。

输入样例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX

输出样例:

YES
NO
NO
NO

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

typedef char ElementType;

typedef struct node *PtrTonode;

struct node{

ElementType *data;

int top;

int maxsize;

};

typedef PtrTonode mystack;

mystack creatstack( int maxsize )

{

mystack ms = (mystack)malloc(sizeof(struct node));

ms->data = (ElementType *)malloc(1000 * sizeof(ElementType));

ms->top = -1;

ms->maxsize = maxsize;

return ms;

}

void popdata( mystack ms )

{

ms->top--;

}

void pushdata(mystack ms)

{

ms->top++;

}

int main()

{

int N,M,i,j;

scanf("%d %d",&N,&M);

mystack ms;

ms = creatstack(M);

for(i=0;i<N;i++)

{

scanf("%s",ms->data);

for(j=0;ms->data[j] != '\0';j++)

{

if(ms->data[j] == 'S' && ms->top < ms->maxsize - 1)

{

pushdata(ms);

}

else if(ms->data[j] == 'X' && ms->top != -1)

{

popdata(ms);

}

else

{

break;

}

}

if( ms->top == -1 && ms->data[j] == '\0')

{

printf("YES\n");

}

else

{

printf("NO\n");

}

ms->top = -1;

}

return 0;

}

这里主要注意下gets(ms->data)和scanf("%s",&ms->data)的区别;

gets 与 scanf 输入字符串的方式也非常类似,但是有几个区别:

(1) gets 的输入分割符只有回车,因此 gets 是能够读入空格的。如果输入为”hello world”时,上面程序的运行结果是”hello world”。而如果用 scanf 则只能输出 hello

(2) 此外,scanf 和 gets 对待缓冲区里的回车符也是完全不同的。scanf 在读取非空白符之前会忽略回车,读取之后如果遇到回车会停止输入,将其留着缓冲区里;gets 只要一遇到回车就输入结束,并把这个回车从缓冲区里移走。

(3) gets 可以读取空回车,但是 scanf 不能。

gets 从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保 buffer 的空间足够大,以便在执行读操作时不发生溢出。

习题3.9 堆栈操作合法性 (20分)相关推荐

  1. 7-11 堆栈操作合法性 (20 分)以及堆栈讲解(c语言实现)

    关于堆栈: 1.它是什么 2.它为什么会出现/它的出现解决了什么问题 3.我们要怎么使用它 堆和栈到底是什么 栈和堆(托管堆)都存在于进程的虚拟内存中. 栈(Stack) 是操作系统在建立某个进程时或 ...

  2. 7-113 堆栈操作合法性 (20 分)

    7-113 堆栈操作合法性 (20 分) 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序 ...

  3. 7-1 堆栈操作合法性 (15 分)

    ** 7-1 堆栈操作合法性 (15 分) ** 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空, ...

  4. 【PTA】7-1 堆栈操作合法性 (18 分)

    倒也不用真的用到栈. #include<iostream> using namespace std; int main() {int n,m;cin>>n>>m;w ...

  5. 7-1 堆栈操作合法性(20 分)

    7-1 堆栈操作合法性(20 分) 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合 ...

  6. 习题3.12 另类循环队列 (20 分)

    习题3.12 另类循环队列 (20 分) 如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数.请编写算法实现队列的入队和出队操作. 函数 ...

  7. 习题3.8 符号配对 (20 分)【满分】【c语言】

    习题3.8 符号配对 (20 分) 请编写程序检查C语言源程序中下列符号是否配对:/与/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标 ...

  8. 习题11-7 奇数值结点链表 (20 分) -链表

    习题11-7 奇数值结点链表 (20 分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode {int ...

  9. 堆栈操作合法性 C++

    温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长. 目录 题目描述 思路分析 AC代码 题目描述 假设以S和X分别表示 ...

最新文章

  1. [JavaScript] Math里的api
  2. SCOM2012R2 (5) MONITOR WINDOWS OF WORKGROUP
  3. ElasticSearch 学习笔记 - 10.指标聚合
  4. 如何解决提示the operation % is undefined for the argument type string,int的错误
  5. 算法中分类与聚类的区别?
  6. ServiceStack.Text反序列化lowercase_underscore_names格式的JSON
  7. Android之封装倒计时页面
  8. 2020云栖大会编程限时抢答赛 - 早中晚3场题解
  9. SBO错误提示总帐科目缺失解决方法
  10. 00018_流程控制语句switch
  11. 数据库利器Navicat最全快捷键整理
  12. 实验一 框架的选择及其原因
  13. C1 WPF C1FlexGrid设置样式技巧:单元格设置背景色
  14. Octopress使用中经验总结
  15. 胡学纲数据结构c语言PDF,数据结构精品课程参考书目
  16. python能运行vb_vb编程 vb还是python强大
  17. nero burning rom 2021绿色版安装及使用教程
  18. 集成editormd支持markdown语法(二)之页面显示及回显
  19. 【第一节】抠图 -- 薄、透、露的朦胧感
  20. 7zip打不开wim文件

热门文章

  1. Linux机器学习软件配置
  2. jetbrains ide连接服务器上的docker
  3. mysql 安装绑定my.ini
  4. [APIO2013]机器人(斯坦纳树)
  5. 免费证书https://lamp.sh/ssl.html
  6. Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...
  7. 分布式技术追踪 2018年第二期
  8. Android so减包相关
  9. Enterprise Library 4.1学习笔记3----安全应用程序块
  10. apipost 如何分享多个接口