栈

Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

 

Description

You are given a string consisting of parentheses () and []. A string of this type is said to be correct:

(a)
if it is the empty string
(b)
if A and B are correct, AB is correct,
(c)
if A is correct, () and [] is correct.

Write a program that takes a sequence of strings of this type and check their correctness. Your program can assume that the maximum string length is 128.

Input

The file contains a positive integer n and a sequence of n strings of parentheses () and [], one string a line.

Output

A sequence of Yes or No on the output file.

Sample Input

3
([])
(([()])))
([()[]()])()

Sample Output

Yes
No
Yes

对于一个初学者,对栈的使用会有疑惑,什么是栈?怎么用它?很多书上解释的并不清楚。

简单说一下:

栈 (stack)又称堆栈,是一种受限制的线性表,其限制是只允许在表的一端进行插入和删除。

允许操作的一端称为栈顶(top),不允许 操作的称为栈底(bottom),每每次删除的数据元素总是最后插入的数据元素,所以栈又称为“后入先出表”,这是和队列的区别。

栈的储存结构有2种:一种顺序储存结构(顺序栈),一种链式储存结构(链式栈)。

今天主要来看看如何实现一个栈的功能

首先,栈的基本功能有:

1.       empty 判断堆栈是否为空

2.       pop   向堆栈里面压入一个数据

3.       push        向堆栈压入一个数据

4.       size          返回当前堆栈长度(即内部数据个数)

5.       top           得到堆栈栈顶数据

此题题意:

输入一个包含()和[]的括号序列,判断是否合法。

具体递归定义如下:1.空串合法;2.如果A和B都合法,则AB合法;3.如果A合法则(A)和[A]都合法。 

注意输入可能有空串

直接用栈

#include<iostream>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std; bool judge(char a,char b)
{
  if(a=='['&&b==']')return ;
  if(a=='('&&b==')')return ;
  return ;
} bool left(char a)
{
  if(a=='['||a=='(')return ;
  return ;
} int main()
{
  int cas;
  char s[];
  cin>>cas;
  getchar();
while(cas--)
{
stack<char>q;
gets(s);
  if(strcmp(s,"\n")==)
{
  cout<<"Yes"<<endl;
  continue;
}
  for(int i=;s[i];i++)
{
  if(q.empty())
{
    q.push(s[i]);
}
  else if(!judge(q.top(),s[i]))
{
  if(left(s[i]))
    q.push(s[i]);
}
  else     q.pop();
}
  if(q.empty())     cout<<"Yes"<<endl;
  else     cout<<"No"<<endl;
}
  return ;
}

我自己的是下面这一种,可能更容易理解一些,也是栈的思想

#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,T;
int flag;
int s[],st,top;
char c[];
scanf("%d",&T);
getchar();
while(T--)
{
fgets(c,sizeof(c),stdin);
flag=;
j=;
for(i=; c[i]!='\n'; i++)
{
if(c[i]=='(')
s[j++]=;
else if(c[i]=='[')
s[j++]=;
else if(c[i]==')')
{
if(j!= && s[j-]==)
j--;
else
{
flag=;
break;
}
}
else if(c[i]==']')
{
if(j!= && s[j-]==)
j--;
else
{
flag=;
break;
}
}
else
{
flag=;
break;
}
}
if(flag==|| j!=)
printf("No\n");
else
printf("Yes\n");
}
return ;
}

看了别人代码加我百度才明白栈的用法,发现要学的好多。。

UVa 673 Parentheses Balance(栈的使用)的更多相关文章

  1. UVA 673 Parentheses Balance (栈)

    题意描述: 给出一段只包含()和[]的字符串,判断是否合法,合法输出YES,不合法输出NO 规则: 1.该串为空,则合法 2.若A合法,B合法,则AB合法 3.若A合法,则(A)和[A]均合法 解题思 ...

  2. UVa 673 Parentheses Balance -SilverN

    You are given a string consisting of parentheses () and []. A string of this type is said to be corr ...

  3. UVa 673 Parentheses Balance

    一个匹配左右括号的问题 /*UVa 673 Parentheses Balance*/ #include<iostream> #include<algorithm> #incl ...

  4. UVa 673 Parentheses Balance【栈】

    题意:输入一个包含"()"和"[]"的序列,判断是否合法 用栈来模拟,遇到"(",“[”就入栈,遇到')',']'就取出栈顶元素看是否匹配, ...

  5. UVa 673 Parentheses Balance (stack)

    题目描述 : 判断字符串是不是符合正确的表达式形式. 要点 : 考虑字符串为空的时候,用getline输入,每一次判断后如果为No则要清空栈.对称思想. 注意输入格式. 代码: #include &l ...

  6. 【UVA】673 Parentheses Balance(栈处理表达式)

    题目 题目     分析 写了个平淡无奇的栈处理表达式,在WA了5发后发现,我没处理空串,,,,(或者说鲁棒性差?     代码 #include <bits/stdc++.h> usin ...

  7. uva673 - Parentheses Balance(栈)

    题意:1.空串合法.2.若A和B合法,则AB合法.3.若A合法,则(A)和[A]合法. 思路:遍历串,遇到(或[,则压入队列,若遇到),判断:若栈空,则不合法:若栈顶元素不是(,也不合法.]同理.因为 ...

  8. UVa673 Parentheses Balance

    // UVa673 Parentheses Balance // 题意:输入一个包含()和[]的括号序列,判断是否合法. // 具体递归定义如下:1.空串合法:2.如果A和B都合法,则AB合法:3.如 ...

  9. UVA 673 (13.08.17)

     Parentheses Balance  You are given a string consisting of parentheses () and []. Astring of this ty ...

随机推荐

  1. 使用Multipath进行多链路聚合并对聚合后的设备固定命名

    使用Multipath进行多链路聚合并对聚合后的设备固定命名 1.启用Multipath: (1)启动multipathd服务 #service multipathd start 或者 #/etc/i ...

  2. Android URI简单介绍

    就Android平台而言,URI主要分三个部分:scheme, authority and path.当中authority又分为host和port.格式例如以下: scheme://host:por ...

  3. select菜单实现二级联动

    <tr> <th>执行人<b>*</b></th> <td> <select name="jdcld.ZXDW& ...

  4. SVN Checkout 不包括源文件夹根目录(转)

    SVN Checkout 不包括源文件夹根目录,比如我要checkout   trunk/ 下面的所有文件,但是不包括trunk 文件夹 我们可以在svn文件夹后面打个空格,在加个“.”就行了 eg: ...

  5. lnux内核的malloc实现(Oracle的cache buffer影子)

    lnux内核的malloc实现(Oracle的cache buffer影子) 本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/artic ...

  6. CF 19D Points 【线段树+平衡树】

    在平面上进行三种操作: 1.add x y:在平面上添加一个点(x,y) 2.remove x y:将平面上的点(x,y)删除 3.find x y:在平面上寻找一个点,使这个点的横坐标大于x,纵坐标 ...

  7. [转]Vim 复制粘帖格式错乱问题的解决办法

    有时候,复制文本(尤其是代码)到 Vim,会出现格式错乱的问题.看样子,应该是自动缩进惹得祸.本文不去深究原因,直接给出解决方法. 1. paste 模式 运行如下命令,进入 paste 模式: :s ...

  8. 从C到汇编:栈是计算机工作的基础

             作者:r1ce        原创作品转载请注明出处       <Linux内核分析> MOOC课程http://mooc.study.163.com/course/U ...

  9. codevs1051单词接龙(栈)

    /* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否 ...

  10. Java 数据类型转换(转换成字节型)

    package com.mystudypro.byteutil; import java.io.UnsupportedEncodingException; public class ConToByte ...