习题3.9 堆栈操作合法性 (20分)
习题3.9 堆栈操作合法性
假设以S
和X
分别表示入栈和出栈操作。如果根据一个仅由S
和X
构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S
和X
序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S
和X
构成的序列。序列保证不为空,且长度不超过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分)相关推荐
- 7-11 堆栈操作合法性 (20 分)以及堆栈讲解(c语言实现)
关于堆栈: 1.它是什么 2.它为什么会出现/它的出现解决了什么问题 3.我们要怎么使用它 堆和栈到底是什么 栈和堆(托管堆)都存在于进程的虚拟内存中. 栈(Stack) 是操作系统在建立某个进程时或 ...
- 7-113 堆栈操作合法性 (20 分)
7-113 堆栈操作合法性 (20 分) 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序 ...
- 7-1 堆栈操作合法性 (15 分)
** 7-1 堆栈操作合法性 (15 分) ** 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空, ...
- 【PTA】7-1 堆栈操作合法性 (18 分)
倒也不用真的用到栈. #include<iostream> using namespace std; int main() {int n,m;cin>>n>>m;w ...
- 7-1 堆栈操作合法性(20 分)
7-1 堆栈操作合法性(20 分) 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合 ...
- 习题3.12 另类循环队列 (20 分)
习题3.12 另类循环队列 (20 分) 如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数.请编写算法实现队列的入队和出队操作. 函数 ...
- 习题3.8 符号配对 (20 分)【满分】【c语言】
习题3.8 符号配对 (20 分) 请编写程序检查C语言源程序中下列符号是否配对:/与/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标 ...
- 习题11-7 奇数值结点链表 (20 分) -链表
习题11-7 奇数值结点链表 (20 分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode {int ...
- 堆栈操作合法性 C++
温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长. 目录 题目描述 思路分析 AC代码 题目描述 假设以S和X分别表示 ...
最新文章
- [JavaScript] Math里的api
- SCOM2012R2 (5) MONITOR WINDOWS OF WORKGROUP
- ElasticSearch 学习笔记 - 10.指标聚合
- 如何解决提示the operation % is undefined for the argument type string,int的错误
- 算法中分类与聚类的区别?
- ServiceStack.Text反序列化lowercase_underscore_names格式的JSON
- Android之封装倒计时页面
- 2020云栖大会编程限时抢答赛 - 早中晚3场题解
- SBO错误提示总帐科目缺失解决方法
- 00018_流程控制语句switch
- 数据库利器Navicat最全快捷键整理
- 实验一 框架的选择及其原因
- C1 WPF C1FlexGrid设置样式技巧:单元格设置背景色
- Octopress使用中经验总结
- 胡学纲数据结构c语言PDF,数据结构精品课程参考书目
- python能运行vb_vb编程 vb还是python强大
- nero burning rom 2021绿色版安装及使用教程
- 集成editormd支持markdown语法(二)之页面显示及回显
- 【第一节】抠图 -- 薄、透、露的朦胧感
- 7zip打不开wim文件
热门文章
- Linux机器学习软件配置
- jetbrains ide连接服务器上的docker
- mysql 安装绑定my.ini
- [APIO2013]机器人(斯坦纳树)
- 免费证书https://lamp.sh/ssl.html
- Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...
- 分布式技术追踪 2018年第二期
- Android so减包相关
- Enterprise Library 4.1学习笔记3----安全应用程序块
- apipost 如何分享多个接口