刚刚拿到题目的时候,还没啥感觉,就是觉得要用到if--else就可以了,但是一联想到现在是在学栈,那么是不是要用到栈呢?

一、那么先看看题目吧

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入格式:
输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。 输出格式:
如果括号配对,输出yes,否则输出no。 输入样例1:
sin(+)
输出样例1:
yes
输入样例2:
{[}]
输出样例2:
no
作者: 李廷元
单位: 中国民用航空飞行学院
时间限制: ms
内存限制: MB
代码长度限制: KB
 
对于这道题来说,首先是对栈的一个构建,对栈的初始化,入栈,出栈,接着就是对栈在主函数中的声明,
我对本题的思考:(从一开始就想错了,浪费了大量的时间)就是在输出的时候,还要去发现哪个括号没有配对,缺少了哪个括号...
                               但是回过头来看题,本题就是很简单的一道题目,只要发现没有办出栈,或者法配对的括号,直接输出no即可
 
从题目的思考:首先读入数据,然后是左括号,直接入栈,遇到右括号,就出栈,若无法出栈--即为空栈,或者出栈的符号不匹配,即为直接break,跳出循环,输出no;
 
以下代码仅供参考:
     #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,cin.getline(),想到了cin.get()还有string,于是就想去查一查他们到底有什么不同
二、关于cin.getline()函数及其它输出流的一些基本原理
 
程序的输入都建有一个缓冲区,即输入缓冲区。每次输入都要用到缓冲区,每次输入结束时会将输入的数据存入输入缓冲区。
 
1.cin函数
cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。cin在遇到 空格 或者 tab 时,就会停止输入。

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的一系列操作将停止

 
4、getline(istream is,string str,结束符)
该函数的结束符默认为enter,但是该函数与前面三种函数的不同是,它在string 的库函数里,而不是前面的istream流,因此要调用时需要加上#include<string>头文件,因此该函数所对应的兑入是string类型
该方法也不是遇到空白字符(tab, space, enter(当结束符不是默认enter时))就结束输入的,且会丢弃最后一个换行符。

  

参考网址:

https://blog.csdn.net/a3192048/article/details/80303547

关于符号匹配题的一些思考过程--含cin.getline()函数的一些基本原理的更多相关文章

  1. 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)

    首先是昨天在北京大学oj网上看到一个简单的算法题目,虽然简单,但是如何完成一段高效.简洁.让人容易看懂的代码对于我这个基础不好,刚刚进入计算机行业的小白来说还是有意义的.而且在写代码的过程中,会发现自 ...

  2. keystonejs富文本问题及思考过程

    上一篇讲了keystonejs的环境搭建,helloworld跑起来之后,实际运用中会发现各种问题,今天就说下富文本编辑器的问题(针对后端不熟的同学). 不太熟悉网页嵌入富文本编辑器的同学可能和我一样 ...

  3. Python3正则匹配re.split,re.finditer及re.findall函数用法详解

    这篇文章主要介绍了Python3正则匹配re.split,re.finditer及re.findall函数用法,结合实例形式详细分析了正则匹配re.split,re.finditer及re.finda ...

  4. C语言数据结构----栈的应用(程序的符号匹配检测)

    本节主要讲利用栈来实现一个程序中的成对出现的符号的检测,完成一个类似编译器的符号检测的功能,采用的是链式栈. 一.问题的提出以及解决方法 1.假定有下面一段程序: #include <stdio ...

  5. OpenVPN多实例优化的思考过程

    1.sss 当构建组件之间的关系已经错综复杂到接近于一张全然图的时候,就要换一个思路了,或者你须要重构整个系统,或者你将又一次实现一个. 2.TAP网卡和TUN网卡 2.1.TAP的优势 1.方便组网 ...

  6. What number should I guess next ?——由《鹰蛋》一题引发的思考

    What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...

  7. 【转】KM匹配题集

    转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...

  8. 一个JAVA题引发的思考

    转载自:http://www.cnblogs.com/heshan664754022/archive/2013/03/24/2979495.html 十年半山 今天在论坛闲逛的时候发现了一个很有趣的题 ...

  9. 【长期更新】Leetcode刷题心得与思考

    1.递归与动态规划的思考 Leetcode第95题 递归问题最重要的问题是想明白函数的作用是什么? 这个例子中函数的返回值就是给定a-b这个区间的数字,返回它所有可能的Tree,此时你不需要明白具体怎 ...

随机推荐

  1. 根据关键字获取高德地图poi信息

    根据关键字获取高德地图poi信息 百度地图和高德地图都提供了根据关键字获取相应的poi信息的api,不过它们提供给普通开发者使用的次数有限无法满足要求.其次百度地图返回的poi中位置信息不是经纬度,而 ...

  2. Judy Beta 第二天

    Intro 我们采取的code review方式是两人一组,每个人在自己的分支上完成工作后向master分支发起pull request,小组的另一人对pr进行review后merge进入原仓库.gi ...

  3. python机器可读数据-XML

    XML XML是一门标记语言.也就是说,它具有包含格式化数据的文档结构. XML文档本质上只是格式特殊的数据文件. 在XML文件中有两个位置可以保存数据值:2个标签之间,标签的属性. 导入XML数据 ...

  4. ansj分词

    本文转载至:https://blog.csdn.net/bitcarmanlee/article/details/53607776 最近的项目需要使用到分词技术.本着不重复造轮子的原则,使用了ansj ...

  5. ESP32搭建1.VMware Workstation 12.5下Ubuntu16.04环境搭建(简易搭建)

    一.需要下载的资源: 1.     下载VMware Workstation 链接: https://pan.baidu.com/s/1nuDEc3n 密码: 89xc 2.     下载Ubuntu ...

  6. 练习 map集合被使用是因为具备映射关系 "进度班" "01" "张三" "进度班" "02" "李四" "J1701" "01" "王五" "J1701" "02" "王二" 此信息中,我们要怎样把上述信息装入集合中, 根据班级信息的到所有的所有信

    package com.rf.xs; import java.util.Arrays; public class Student01 { String name; int age; public St ...

  7. php字符串转数组

    下面代码包括了含有中文汉字的字符. function str2arr($str) { $length = mb_strlen($str, 'utf-8'); $array = []; for ($i= ...

  8. Linux:Gentoo系统的安装笔记(三)

    这期笔记将是gentoo安装的最后一期了,虽然已经配置内核了,但是也要完成剩下的安装步骤,这离安装完成已经不远了,继续加油!!! 如果中断了安装,请看第二期的笔记进行恢复安装,但请重新编译一次内核,否 ...

  9. 《A Knowledge-Grounded Neural Conversation Model》

    abstract 现在的大多数模型都可以被应用在闲聊场景下,但是还没有证据表明他们可以应用在更有用的对话场景下.这篇论文提出了一个知识驱动的,带有背景知识的神经网络对话系统,目的是为了在对话中产生更有 ...

  10. jquery tmpl生成导航

    引入<script src="jquery.tmpl.min.js"></script> html<ul class="nav" ...