zoukankan      html  css  js  c++  java
  • 关于符号匹配题的一些思考过程--含cin.getline()函数的一些基本原理

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

    一、那么先看看题目吧

    给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
    
    输入格式:
    输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。
    
    输出格式:
    如果括号配对,输出yes,否则输出no。
    
    输入样例1:
    sin(10+20)
    输出样例1:
    yes
    输入样例2:
    {[}]
    输出样例2:
    no
    作者: 李廷元
    单位: 中国民用航空飞行学院
    时间限制: 400 ms
    内存限制: 64 MB
    代码长度限制: 16 KB
     
    对于这道题来说,首先是对栈的一个构建,对栈的初始化,入栈,出栈,接着就是对栈在主函数中的声明,
    我对本题的思考:(从一开始就想错了,浪费了大量的时间)就是在输出的时候,还要去发现哪个括号没有配对,缺少了哪个括号...
                                   但是回过头来看题,本题就是很简单的一道题目,只要发现没有办出栈,或者法配对的括号,直接输出no即可
     
    从题目的思考:首先读入数据,然后是左括号,直接入栈,遇到右括号,就出栈,若无法出栈--即为空栈,或者出栈的符号不匹配,即为直接break,跳出循环,输出no;
     
    以下代码仅供参考:
      1     #include<iostream>
      2     #include<string>
      3     #define Maxsize 100
      4     #define OK 1
      5     #define ERROR 0
      6     #define OVERFLOW -2
      7     using namespace std;
      8     typedef int Status;
      9     typedef char SElemType;
     10     
     11     typedef struct
     12 {
     13     char *base;
     14     char *top;
     15     int stacksize;
     16 } SqStack;
     17     //初始化 
     18     Status InitStack(SqStack &S)
     19     {//构造一个空栈
     20     S.base = new SElemType[Maxsize];
     21     if (!S.base) exit (OVERFLOW);
     22     S.top = S.base;
     23     S.stacksize = Maxsize;
     24     return OK; 
     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     return OK; 
     33     }
     34     
     35     //出栈
     36     Status Pop(SqStack &S, SElemType e)
     37     {//删除S的栈顶元素,用e返回其值
     38     if(S.top == S.base) return ERROR;
     39     e = *--S.top;
     40     return OK; 
     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 int main()
     53 {
     54     int i;
     55     SqStack s;
     56     char str[100];
     57     char e;
     58     
     59     InitStack(s);
     60     
     61     cin.getline(str,101); //最多输入字符串100个 
     62     
     63     for(i=0;i<Maxsize;i++)  
     64     {
     65         e=str[i];
     66         if(e=='('||e=='{'||e=='[')  //如果输入左边的括号符 (,{,[ 则入栈 
     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<<"no"<<endl;
     79                 return 0;
     80             }
     81         }
     82         else if(e=='}')//大括号匹配 
     83         {
     84             if(*(s.top-1)=='{')
     85             {
     86                 Pop(s,e);
     87             }
     88             else
     89             {
     90                 cout<<"no"<<endl;
     91                 return 0;
     92             }
     93         }
     94         else if(e==']')//中括号匹配
     95         {
     96             if(*(s.top-1)=='[')
     97             {
     98                 Pop(s,e);
     99             }
    100             else
    101             {
    102                 cout<<"no"<<endl;
    103                 return 0;
    104             }
    105         }
    106     }
    107         if(s.top==s.base)  //如果栈空,则说明全部匹配成功 
    108     {
    109         cout<<"yes"<<endl;
    110     }
    111     else if(s.top!=s.base)
    112     {
    113         cout<<"no"<<endl;
    114     }        
    115 
    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),因为最后一个为''。

    注意: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

  • 相关阅读:
    vue项目实战:原生百度地图api的使用
    vue项目实战:页面公共组件的全局注册动态引入的考虑
    celery+django的定时任务设置
    celery.exceptions.NotRegistered: 'tasks.add' + celery delay 坑 + python manage.py check 查看状态
    from __future__ import absolute_import的作用
    Django与celery集成:异步任务原理和过程
    python -m pip install --upgrade pip --default-timeout=100 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
    Django 的安全
    django集成sentry实现日志上报和钉钉告警
    TypeScript(21): 装饰器
  • 原文地址:https://www.cnblogs.com/JeffKing11/p/10612567.html
Copyright © 2011-2022 走看看