UVa 673 Parentheses Balance(栈的使用)
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, (A ) and [A ] 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(栈的使用)的更多相关文章
- UVA 673 Parentheses Balance (栈)
题意描述: 给出一段只包含()和[]的字符串,判断是否合法,合法输出YES,不合法输出NO 规则: 1.该串为空,则合法 2.若A合法,B合法,则AB合法 3.若A合法,则(A)和[A]均合法 解题思 ...
- UVa 673 Parentheses Balance -SilverN
You are given a string consisting of parentheses () and []. A string of this type is said to be corr ...
- UVa 673 Parentheses Balance
一个匹配左右括号的问题 /*UVa 673 Parentheses Balance*/ #include<iostream> #include<algorithm> #incl ...
- UVa 673 Parentheses Balance【栈】
题意:输入一个包含"()"和"[]"的序列,判断是否合法 用栈来模拟,遇到"(",“[”就入栈,遇到')',']'就取出栈顶元素看是否匹配, ...
- UVa 673 Parentheses Balance (stack)
题目描述 : 判断字符串是不是符合正确的表达式形式. 要点 : 考虑字符串为空的时候,用getline输入,每一次判断后如果为No则要清空栈.对称思想. 注意输入格式. 代码: #include &l ...
- 【UVA】673 Parentheses Balance(栈处理表达式)
题目 题目 分析 写了个平淡无奇的栈处理表达式,在WA了5发后发现,我没处理空串,,,,(或者说鲁棒性差? 代码 #include <bits/stdc++.h> usin ...
- uva673 - Parentheses Balance(栈)
题意:1.空串合法.2.若A和B合法,则AB合法.3.若A合法,则(A)和[A]合法. 思路:遍历串,遇到(或[,则压入队列,若遇到),判断:若栈空,则不合法:若栈顶元素不是(,也不合法.]同理.因为 ...
- UVa673 Parentheses Balance
// UVa673 Parentheses Balance // 题意:输入一个包含()和[]的括号序列,判断是否合法. // 具体递归定义如下:1.空串合法:2.如果A和B都合法,则AB合法:3.如 ...
- UVA 673 (13.08.17)
Parentheses Balance You are given a string consisting of parentheses () and []. Astring of this ty ...
随机推荐
- 使用atomic一定是线程安全的吗
这个问题很少遇到,但是答案当然不是.atomic在set方法里加了锁,防止了多线程一直去写这个property,造成难以预计的数值.但这也只是读写的锁定.跟线程安全其实还是差一些.看下面. @inte ...
- Flex3在应用RemoteObject出现问题解决方法
出现该问题 <mx:RemoteObject id="robj" destination="hello" endpoint="http://lo ...
- Linux 安全
Linux 安全 1.安装 使系统处于单独(或隔离)的网络中.以防止未受保护的系统连接到其它网络或互联网中受到可能的攻击 安装完成后将下面软件卸载 pump ...
- url找不到指定位置
刚才遇到了把css装入一个文件夹下,然后有的图片失效了. 后来解决是在.css里把./images 换成 ../images 原来css找图片的地址是基于自身.css文件的位置寻找的,不是以引用它的. ...
- 使用Xcode8的Instruments检测解决iOS内存泄露(leak)
在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...
- 在Quick-cocos2dx中使用云风pbc解析Protocol Buffers,支持win、mac、ios、android
本例主要介绍 如何将 pbc 集成到quick-cocos2dx框架中,让我们的cocos2dx客户端Lua拥有编解码Protocol Buffers能力. 参考: 云风pbc的用法: http:// ...
- 多版本号并发控制(MVCC)在分布式系统中的应用
QQ群:289150599 问题 近期项目中遇到了一个分布式系统的并发控制问题.该问题能够抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 ... Ln组成:D本质上是一个key-va ...
- 深入探索C++对象模型-1
概述 在实际生产中,遇到一个复杂的类,如果能看出这个类的内存模型结构,那么以后的操作基本就没有难度的: 所以说,学会分析一个类的内存模型,是每一个C++程序员必须要会的知识. 下面,就让我们来了解C+ ...
- 教学项目之-通过Python实现简单的计算器
教学项目之-通过Python实现简单的计算器 计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/ ...
- State 状态模式
简介 状态模式允许一个对象在其内部[状态]改变的时候改变其[行为].这个对象看上去就像是改变了它的类一样. 用一句话来表述,状态模式把所研究的对象的[行为]包装在不同的[状态对象]里,[每一个状态对象 ...