C语言getline函数CSDN,关于符号匹配题的一些思考过程--含cin.getline()函数的一些基本原理...

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

一、那么先看看题目吧

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

输入格式:

输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:

如果括号配对,输出yes,否则输出no。

输入样例1:

sin(10+20)

输出样例1:

yes

输入样例2:

{[}]

输出样例2:

no

作者: 李廷元

单位: 中国民用航空飞行学院

时间限制:400ms

内存限制:64MB

代码长度限制:16 KB

对于这道题来说,首先是对栈的一个构建,对栈的初始化,入栈,出栈,接着就是对栈在主函数中的声明,

我对本题的思考:(从一开始就想错了,浪费了大量的时间)就是在输出的时候,还要去发现哪个括号没有配对,缺少了哪个括号...

但是回过头来看题,本题就是很简单的一道题目,只要发现没有办出栈,或者法配对的括号,直接输出no即可

从题目的思考:首先读入数据,然后是左括号,直接入栈,遇到右括号,就出栈,若无法出栈--即为空栈,或者出栈的符号不匹配,即为直接break,跳出循环,输出no;

以下代码仅供参考:

1 #include

2 #include

3 #define Maxsize 100

4 #define OK 1

5 #define ERROR 0

6 #define OVERFLOW -2

7 using namespacestd;8 typedef intStatus;9 typedef charSElemType;10

11 typedef struct

12 {13 char *base;14 char *top;15 intstacksize;16 } SqStack;17 //初始化

18 Status InitStack(SqStack &S)19 {//构造一个空栈

20 S.base = newSElemType[Maxsize];21 if (!S.base) exit (OVERFLOW);22 S.top = S.base;23 S.stacksize =Maxsize;24 returnOK;25 }26

27 //入栈

28 Status Push(SqStack &S, SElemType e)29 {//插入元素e为新的栈顶

30 if(S.top-S.base == S.stacksize) return ERROR;//判断是否栈满

31 *S.top++ =e;32 returnOK;33 }34

35 //出栈

36 Status Pop(SqStack &S, SElemType e)37 {//删除S的栈顶元素,用e返回其值

38 if(S.top == S.base) returnERROR;39 e = *--S.top;40 returnOK;41 }42

43 //取栈顶元素

44 SElemType GetTop(SqStack S)45 {//返回S 的栈顶元素, 不修改栈顶指针

46 if(S.top == S.base)47 return *(S.top-1) ;48 }49

50

51

52 intmain()53 {54 inti;55 SqStack s;56 char str[100];57 chare;58

59 InitStack(s);60

61 cin.getline(str,101); //最多输入字符串100个

62

63 for(i=0;i

67 {68 Push(s,e);69 }70 else if(e==')') //如果输入右边的括号符,则进行比较

71 {72 if(*(s.top-1)=='(') //如果栈顶符合能与其匹配,则将栈顶的元素出栈

73 {74 Pop(s,e);75 }76 else

77 {78 cout<

83 {84 if(*(s.top-1)=='{')85 {86 Pop(s,e);87 }88 else

89 {90 cout<

101 {102 cout<

108 {109 cout<

116 return 0;117 }

当然,还有一些问题没有修改,就是在后面的主函数中,没有将判断空栈重新利用一个函数,导致该程序的时间复杂度与空间复杂度还是需要提高

解决方法:重新设置一个判断栈空的函数,然后在主函数中调用即可

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

因为从上面那道题想到输入字符的时候,想到了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类型

该方法也不是遇到空白字符(tab, space, enter(当结束符不是默认enter时))就结束输入的,且会丢弃最后一个换行符。

参考网址:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值