关于符号匹配题的一些思考过程--含cin.getline()函数的一些基本原理
刚刚拿到题目的时候,还没啥感觉,就是觉得要用到if--else就可以了,但是一联想到现在是在学栈,那么是不是要用到栈呢?
一、那么先看看题目吧
给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入格式:
输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。
输出格式:
如果括号配对,输出yes,否则输出no。
输入样例1:
sin(+)
输出样例1:
yes
输入样例2:
{[}]
输出样例2:
no
作者: 李廷元
单位: 中国民用航空飞行学院
时间限制: ms
内存限制: MB
代码长度限制: KB
#include<iostream>
#include<string>
#define Maxsize 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int Status;
typedef char SElemType; typedef struct
{
char *base;
char *top;
int stacksize;
} SqStack;
//初始化
Status InitStack(SqStack &S)
{//构造一个空栈
S.base = new SElemType[Maxsize];
if (!S.base) exit (OVERFLOW);
S.top = S.base;
S.stacksize = Maxsize;
return OK;
} //入栈
Status Push(SqStack &S, SElemType e)
{//插入元素e为新的栈顶
if(S.top-S.base == S.stacksize) return ERROR;//判断是否栈满
*S.top++ = e;
return OK;
} //出栈
Status Pop(SqStack &S, SElemType e)
{//删除S的栈顶元素,用e返回其值
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
} //取栈顶元素
SElemType GetTop(SqStack S)
{//返回S 的栈顶元素, 不修改栈顶指针
if(S.top == S.base)
return *(S.top-) ;
} int main()
{
int i;
SqStack s;
char str[];
char e; InitStack(s); cin.getline(str,); //最多输入字符串100个 for(i=;i<Maxsize;i++)
{
e=str[i];
if(e=='('||e=='{'||e=='[') //如果输入左边的括号符 (,{,[ 则入栈
{
Push(s,e);
}
else if(e==')') //如果输入右边的括号符,则进行比较
{
if(*(s.top-)=='(') //如果栈顶符合能与其匹配,则将栈顶的元素出栈
{
Pop(s,e);
}
else
{
cout<<"no"<<endl;
return ;
}
}
else if(e=='}')//大括号匹配
{
if(*(s.top-)=='{')
{
Pop(s,e);
}
else
{
cout<<"no"<<endl;
return ;
}
}
else if(e==']')//中括号匹配
{
if(*(s.top-)=='[')
{
Pop(s,e);
}
else
{
cout<<"no"<<endl;
return ;
}
}
}
if(s.top==s.base) //如果栈空,则说明全部匹配成功
{
cout<<"yes"<<endl;
}
else if(s.top!=s.base)
{
cout<<"no"<<endl;
} return ;
}
当然,还有一些问题没有修改,就是在后面的主函数中,没有将判断空栈重新利用一个函数,导致该程序的时间复杂度与空间复杂度还是需要提高
解决方法:重新设置一个判断栈空的函数,然后在主函数中调用即可
cin>>sth 中sth的变量类型读取数据,这里变量类型可以为int,float,char,char*,string等诸多类型。这一输入操作,在遇到结束符(Space、Tab、Enter)就结束,且对于结束符,并不保存到变量中。注意:最后一个enter也在存储在缓冲区。
2、cin.get
结束符(默认回车键)表示遇到该符号结束字符串读取,,读取的字符个数最多为(长度 - 1),因为最后一个为'\0'。
注意:cin.get()遇到结束符就会停止读取后续的东西,但是不会将结束符从缓冲区移除。
3、cin.getline
与cin.get()类似,但是又是有区别的。cin.get()在输入的字符串超过长度后,不会引起cin输入函数的错误,如果后面有着cin的操作,那么该函数会继续执行,而且是直接从缓冲区读取数据;cin.getline()函数则是会进行一个报错,后面的cin的一系列操作将停止
该方法也不是遇到空白字符(tab, space, enter(当结束符不是默认enter时))就结束输入的,且会丢弃最后一个换行符。
参考网址:
https://blog.csdn.net/a3192048/article/details/80303547
关于符号匹配题的一些思考过程--含cin.getline()函数的一些基本原理的更多相关文章
- 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)
首先是昨天在北京大学oj网上看到一个简单的算法题目,虽然简单,但是如何完成一段高效.简洁.让人容易看懂的代码对于我这个基础不好,刚刚进入计算机行业的小白来说还是有意义的.而且在写代码的过程中,会发现自 ...
- keystonejs富文本问题及思考过程
上一篇讲了keystonejs的环境搭建,helloworld跑起来之后,实际运用中会发现各种问题,今天就说下富文本编辑器的问题(针对后端不熟的同学). 不太熟悉网页嵌入富文本编辑器的同学可能和我一样 ...
- Python3正则匹配re.split,re.finditer及re.findall函数用法详解
这篇文章主要介绍了Python3正则匹配re.split,re.finditer及re.findall函数用法,结合实例形式详细分析了正则匹配re.split,re.finditer及re.finda ...
- C语言数据结构----栈的应用(程序的符号匹配检测)
本节主要讲利用栈来实现一个程序中的成对出现的符号的检测,完成一个类似编译器的符号检测的功能,采用的是链式栈. 一.问题的提出以及解决方法 1.假定有下面一段程序: #include <stdio ...
- OpenVPN多实例优化的思考过程
1.sss 当构建组件之间的关系已经错综复杂到接近于一张全然图的时候,就要换一个思路了,或者你须要重构整个系统,或者你将又一次实现一个. 2.TAP网卡和TUN网卡 2.1.TAP的优势 1.方便组网 ...
- What number should I guess next ?——由《鹰蛋》一题引发的思考
What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...
- 【转】KM匹配题集
转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...
- 一个JAVA题引发的思考
转载自:http://www.cnblogs.com/heshan664754022/archive/2013/03/24/2979495.html 十年半山 今天在论坛闲逛的时候发现了一个很有趣的题 ...
- 【长期更新】Leetcode刷题心得与思考
1.递归与动态规划的思考 Leetcode第95题 递归问题最重要的问题是想明白函数的作用是什么? 这个例子中函数的返回值就是给定a-b这个区间的数字,返回它所有可能的Tree,此时你不需要明白具体怎 ...
随机推荐
- paramiko向服务器自动上传下载文件
import paramikoimport os def download_from(ip,u,p): file_list=['file2',file3','file4'] file_path=&qu ...
- 手把手教你如何使用Cocos2d Console 进行html5项目发布
手把手教你如何使用Cocos2d Console 进行html5项目发布 1.首先需要先安装Cocos2d Console运行需要的工具. 详情参见 这篇文章 http://www.cocoach ...
- js实现图片局部放大效果
图片局部放大效果结合的知识点主要是DOM的操作,以及事件的应用,所以首先要对DOM的操作有一定了解,其次能对事件的应用有一定的累积. 如上图,可以看到,这是放大镜的基本效果,主要分成左右两个部分.左边 ...
- Java 错误提示org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
java 操作excel文件 发布后报错 org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException XSS ...
- vue-baidu-map 的简单使用
首先附上vue-baidu-map 文档地址: https://dafrok.github.io/vue-baidu-map/#/zh/index 1.安装,初步使用,文档说的都很明白,就不在过多重复 ...
- pytest自动化4:fixture之yield实现teardown
出处:https://www.cnblogs.com/yoyoketang/p/9401554.html 前言: 上一篇介绍了fixture通过scope参数控制setup级别,我们一起来温故下fix ...
- mysql 的存储过程_多字段
mysql 的存储过程 一.准备工作 新建一个表 /*Navicat MySQL Data Transfer Source Server : localhost_3306Source Server V ...
- 用 Cobertura 测量测试覆盖率
尽管测试先行编程(test-first programming)和单元测试已不能算是新概念,但测试驱动的开发仍然是过去 10 年中最重要的编程创新.最好的一些编程人员在过去半个世纪中一直在使用这些 ...
- ES6参数默认值
参数默认值 1.首先,来看一下es5中的函数默认值 var a = a || 10; var b = b || "none" // 当a的值或者b的值为undefined时,根据逻 ...
- KMP算法详细分解
1. 引言 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的 ...