DP_括号匹配序列问题

摘要:
标准时间>pBottom=pS->pNext=空;CharStr)40{41PNODEpNew=(PNODE)malloc(sizeof(NODE));data=Str;//将标头节点指向新节点45}46/*执行堆栈输出*/47charPopStack(PSTACKpS)48{49PNODEp=pS-->//缓存堆栈输出节点地址50charstr=p-->

括号匹配问题


简单括号匹配问题是给出字符串,判断字符串中的括号是否匹配,此类问题核心解决方案就是利用栈的后进先出的特性,从左到右依次遍历字符串,遇左括号进栈,遇右括号将其与栈顶元素配对,若能配对,则栈顶元素出栈,继续遍历,若不能配对,则返回false。字符串遍历结束后,判断栈是否为空,若不为空返回false,若为空,返回true。以下有c和c++实现代码,用c++可以利用标准库提供的顺序容器适配器stack来实现栈结构,c语言则需要自己写栈结构,当然也可以用数组模拟栈结构,用一变量存放数组中最后面的元素的下标代表栈顶指针进行入栈出栈就可以了。

c语言版 题目来自http://nyoj.top/problem/2

 

DP_括号匹配序列问题第1张DP_括号匹配序列问题第2张
  1 /* 
  2 现在有一行括号序列,请你检查这行括号是否配对
  3 输入
  4 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,
  5 每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。
  6 数据保证S中只含有"[", "]", "(", ")" 四种字符
  7 输出
  8 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
  9 实现:
 10 栈模型实现
 11 */
 12 #include<stdio.h>
 13 #include<stdlib.h>
 14 #include<stdbool.h>
 15 
 16 typedef struct Node * PNODE;
 17 
 18 struct Node
 19 {
 20     char data;
 21     PNODE pNext;
 22 }NODE;
 23 
 24 typedef struct Stack
 25 {
 26     PNODE pTop; //永远指向栈顶元素
 27     PNODE pBottom; //永远指向栈顶元素的下一个元素
 28 }STACK,* PSTACK;
 29 
 30 /* 建立空栈 */
 31 void InitStack(PSTACK pS)
 32 {
 33     pS->pTop = (PNODE)malloc(sizeof(NODE)); //头节点
 34     pS->pBottom = pS->pTop;
 35     pS->pTop->pNext = NULL; //将头节点指针域变成空的
 36 }
 37 
 38 /* 进行压栈 */
 39 void PushStack(PSTACK pS,char Str)
 40 {
 41     PNODE pNew = (PNODE)malloc(sizeof(NODE));//建立新节点
 42     pNew->data = Str; //存储数据
 43     pNew->pNext = pS->pTop; //将新节点进行压栈,头进头出
 44     pS->pTop = pNew; //将头节点指向新节点
 45 }
 46 /* 进行出栈 */
 47 char PopStack(PSTACK pS)
 48 {
 49     PNODE p = pS->pTop; //缓存出栈的节点地址
 50     char str = p->data; //缓存出栈的节点数据
 51     
 52     pS->pTop = p->pNext;//将栈顶往后移
 53     free(p);//将出栈节点销毁
 54     return str; //将出栈节点数据返回
 55 }
 56 /* 判断栈是否为空*/
 57 bool empty(PSTACK pS)
 58 {
 59     if(pS->pTop == pS->pBottom)
 60         return true;
 61     else
 62         return false;
 63 }
 64     
 65 /* 扫描字符串 */
 66 bool scanner(char * pStr)
 67 {
 68     STACK S;
 69     int i = 0;
 70     bool ret = true;
 71 
 72     InitStack(&S);
 73     while(*(pStr+i) != '

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇普通新用户的docker权限python 监听键盘输入下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux系统管理06 -----磁盘管理

一、 磁盘结构 1、 硬盘的物理结构(1~3) 盘片:硬盘有多个盘片,每个盘片2面。 磁头:每面一个磁头 2、 硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇形区存放512字节的数据 磁道:同一盘片不同半径的同心圆 柱面:不同盘片相同半径构成的圆柱面 3、 硬盘存储容量=磁头数*磁道 (柱面) 数*每道扇区数*每扇区字节数 4、 硬盘容量:作为计算机...

统计量

1. 表示集中趋势的计量 1.1均值 a. 算数平均数 = 总体标志总量 / 总体单位总量 b. 调和平均数: 又称倒数平均数,它是根据各变量的倒数来计算的平均数。是各变量值倒数的算数平均数的倒数 c. 几何平均数:是计算平均比率或平均发展速度的最常用的统计量,几何平均数可以反映现象总体的一般水平 根据同一组数据计算的结果是:算术平均数>=几何平均数...

从零开始学习GDI+ (二) 基本概念与基本操作

       从零开始学习GDI+ (一)我的第一个GDI+程序        上文给新手学习GDI+讲述了vs环境等的准备工作,并且可以直接用GDI+绘图了。本文开始,讲述的可能偏理论,建议学习的过程中大胆尝试,多使用API。        首先上官方文档https://docs.microsoft.com/en-us/windows/win32/gdi...

请求内部转发与重定向区别

1.请求内部转发     使用:req.getRequestDispatcher("uri").forward(req, resp);       1、多个Servlet共享一个request对象(重点)     2、一次请求,当转发结束的时候也就是业务处理完毕的时候request对象会被销毁     3、地址栏不改变     注意在执行转发完毕后会...

Metasploit Meterpreter持久后门服务:persistence

原文:https://www.fujieace.com/metasploit/meterpreter-service.html 了解Metasploit Meterpreter 在经历了exploit系统的所有艰苦工作之后,为自己留下更简单的方法回到系统供以后使用通常是一个好主意。这样,如果您最初exploit的服务已关闭或打补丁,您仍然可以访问系统。Me...

Spring Boot 统一异常这样处理和剖析,安否?

话说异常 「欲渡黄河冰塞川,将登太行雪满天」,无论生活还是计算机世界难免发生异常,上一篇文章RESTful API 返回统一JSON数据格式 说明了统一返回的处理,这是请求一切正常的情形;这篇文章将说明如何统一处理异常,以及其背后的实现原理,老套路,先实现,后说明原理,有了上一篇文章的铺底,相信,理解这篇文章就驾轻就熟了 实现 新建业务异常 新建 Bus...