栈

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. 滑雪 (搜索)(dp)(贪心)

    以每一点为起点找出所有路径,并求出以此点做为起点的最大路径 求出每个点的最大路径后再找出其中最大的值,输出最大值 #include <stdio.h>#include <string ...

  2. jsp判断手机访问和电脑访问

    <% //取用户操作系统信息 String agent = request.getHeader("User-Agent") == null ? "": r ...

  3. C#中格式化数据的输出

    格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment&q ...

  4. [转]【基于zxing的编解码实战】精简Barcode Scanner篇

    通过<[搞定条形码]zxing项目源码解读(2.3.0版本,Android部分)>的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分 ...

  5. 黑马程序猿_Java 代理机制学习总结

    -------<a href="http://www.itheima.com/"">android培训</a>.<a href=" ...

  6. [置顶] UNIX常用命令

    scp命令用于两个机器之前文件的拷贝 scp 被拷贝文件 远程机器用户名@远程机器IP:拷贝目的目录或者拷贝目录下的目的文件 dos2unix 在执行编译文件时,本来应该生成可执行文件a,但是执行完后 ...

  7. ASP.NET面试

    1.net中读写数据库需要用到那些类?他们的作用都是什么?答:DataSet:数据存储器.DataCommand:执行语句命令.DataAdapter:数据的集合,用语填充.2.介绍一下什么是Code ...

  8. 一位ACM过来人的心得

    刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解. 很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条件. 我 ...

  9. 使用jq深入研究轮播图特性

    网站轮播图 太耳熟的词了  基本上做pc端的 主页绝壁会来一个轮播图的特效 轮播图他一个页面页面的切换,其实的原理是通过css的定位 ,定位到一起,第一张首先显示,其余默认隐藏. 今天我实现的这个轮播 ...

  10. java中的数据库事务处理

    /*java使用事务处理,首先要求数据库支持事务,如使用MYSQL的事务功能,就要求mysql的表类型为Innodb,*/ /*InnoDB,是MySQL的数据库引擎之一 与传统的ISAM与MyISA ...