Num 15: NYOJ: 题目0002 : 括号配对问题 [ 栈(stack) ]
首先要了解有关栈的一些基本知识,即:
什么是栈,栈有什么作用;
1、什么是栈:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
仅同意在表的一端进行插入和删除运算。
( 先进后出的一种数据结构形式 )。
这一端被称为栈顶( top )。相对地,把还有一端称为栈底( bottom );
向一个栈插入新元素又称作进栈( push )、入栈或压栈。它是把新元素放到栈顶元素的上面。使之成为新的栈顶元素;
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉( pop )。使其相邻的元素成为新的栈顶元素。
简单地说,就是在不满足取出条件的时候,新元素压栈。
一直到满足条件后,退栈。一直到一组数据的最后一个元素;
2、栈的作用:
用来在函数调用的时候存储断点。做递归时要用到栈;
题目 : )
括号配对问题
- 描写叙述
- 如今。有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组測试数据。后面的N行输入多组输入数据。每组输入数据都是一个字符串S(S的长度小于10000。且S不是空串)。測试数据组数少于5组。
数据保证S中仅仅含有"[","]","(",")"四种字符
- 输出
- 每组输入数据的输出占一行,假设该字符串中所含的括号是配对的。则输出Yes,假设不配对则输出No
- 例子输入
-
3
[(])
(])
([[]()]) - 例子输出
-
No
No
Yes
分析:
1. 进栈条件: 假设 s[ i ] 是 “(” 或者 " [ " 的时候;
2. 出栈条件: 假设碰到配对的括号;
AC代码:
<span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[11000],b[11000];//b即stack。
int main()
{
int n;
scanf("%d",&n);
getchar();//屏蔽回车;
while(n--)
{
int len,top=1,i;
gets(a);
b[top++]=a[0];
len=strlen(a);
if((a[0]!='[')&&(a[0]!='(')||(len%2==1)) printf("No\n");//若第一个元素为")"或"]"输入个数为奇数,No。
else
{
for(i=1; i<len; i++)
{
if(a[i]=='('||a[i]=='[') b[top++]=a[i];//满足进栈条件,进栈;
else
{
if(a[i]==']'&&b[top-1]=='[') top--;//满足出栈条件。
else if(a[i]==')'&&b[top-1]=='(') top--;
else b[top++]=a[i];
}
}
if(top==1) printf("Yes\n");//假设最后top回到原位( 都配对 )。
else printf("No\n");
}
}
return 0;
}</span>
当然,栈的问题也能够转化为通过数组模拟栈来解决:
AC代码( 数组 ):
<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
char s[11000],c[11000];
int main()
{
int t;
int len;
int i,j,k;
int top;
scanf("%d",&t);
getchar();
while(t--)
{
gets(s);
len=strlen(s);
if(len%2==1)
printf("No\n");
else
{
top=1;
c[0]=s[0];
if(c[0]==']'||c[0]==')')
printf("No\n");
else
{
for(i=1;i<len;i++)
{
c[top]=s[i];
if(top==0)
top++;
else
{
if(c[top-1]=='['&&c[top]==']')
top--;
else if(c[top-1]=='('&&c[top]==')')
top--;
else
top++;
}
}
if(top==0)
printf("Yes\n");
else
printf("No\n");
}
}
}
return 0;
}</span>
这道题仅仅是对栈的简单应用,另外C++头文件stack中包括有栈处理函数。大家有空能够学习一下STL;
这里仅给出C语言中对栈的定义方法 ( 以整形数据处理为例 ) [ 感谢度娘 T T ]:
<span style="font-size:18px;">#include<stdio.h>
#include<malloc.h>
#define DataType int
#define MAXSIZE 1024 typedef struct
{
DataType data[MAXSIZE];
int top;
}SeqStack; SeqStack*Init_SeqStack()//栈初始化
{
SeqStack*s;
s=(SeqStack*)malloc(sizeof(SeqStack));
if(!s)
{
printf("空间不足\n");
return NULL;
}
else
{
s->top=-1;
return s;
}
} int Empty_SeqStack(SeqStack *s)//判栈空
{
if(s->top==-1)
return 1;
else
return 0;
} int Push_SeqStack(SeqStack *s,DataType x)//入栈
{
if(s->top==MAXSIZE-1)
return 0;//栈满不能入栈
else
{
s->top++;
s->data[s->top]=x;
return 1;
}
} int Pop_SeqStack(SeqStack *s,DataType *x)//出栈
{
if(Empty_SeqStack(s))
return 0;//栈空不能出栈
else
{
*x=s->data[s->top];
s->top--;
return 1;
}//栈顶元素存入*x。返回
} DataType Top_SeqStack(SeqStack *s)//取栈顶元素
{
if(Empty_SeqStack(s))
return 0;//栈空
else
return s->data[s->top];
} int Print_SeqStack(SeqStack *s)
{
int i;
printf("当前栈中的元素:\n");
for(i=s->top;i>=0;i--)
printf("%3d",s->data[i]);
printf("\n");
return 0;
} int main()
{
SeqStack*L;
int n,num,m;
int i;
L=Init_SeqStack();
printf("初始化完毕\n");
printf("栈空:%d\n",Empty_SeqStack(L));
printf("请输入入栈元素个数:\n");
scanf("%d",&n);
printf("请输入要入栈的%d个元素:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&num);
Push_SeqStack(L,num);
}
Print_SeqStack(L);
printf("栈顶元素:%d\n",Top_SeqStack(L));
printf("请输入要出栈的元素个数(不能超过%d个):\n",n);
scanf("%d",&n);
printf("依次出栈的%d个元素:\n",n);
for(i=0;i<n;i++)
{
Pop_SeqStack(L,&m);
printf("%3d",m);
}
printf("\n");
Print_SeqStack(L);
printf("栈顶元素:%d\n",Top_SeqStack(L));
return 0;
}</span>
定义stack的简单代码:
stack<int> sta;
入栈:sta.push(x);
出栈:sta.pop();
推断栈的大小: sta.size( );
推断栈是否为空:sta.empty( );
Num 15: NYOJ: 题目0002 : 括号配对问题 [ 栈(stack) ]的更多相关文章
- nyoj 题目2 括号配对问题
描述 今天发现了nyoj,如获至宝.准备开刷. 括号配对问题 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的 ...
- 括号配对问题-java:Stack
题目描述: 现在,有一行括号序列,请你检查这行括号是否配对. 输入描述: 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串 ...
- nyoj 2 括号配对问题 栈
nyoj 2 括号配对问题 题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=2 思路: 栈:'(' '['入栈,遇到 ']' ')'出栈 ...
- 【ACM】括号配对问题 - 栈
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- 括号配对问题_栈<stack>
问题 A: 括号配对问题 时间限制: 3 Sec 内存限制: 128 MB提交: 3 解决: 2[提交][状态][讨论版] 题目描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行 ...
- NYOJ之括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N&l ...
- 括号配对问题--nyoj-2(栈)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=10 ...
- nyoj 2 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0& ...
- nyoj 2 括号配对问题(stack)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0& ...
随机推荐
- 怎样在nexus 中 搜索到远程maven仓库中的jar 文件
怎样在nexus 中 搜索到远程maven仓库中的jar 文件 url: http://www.oschina.net/question/95712_21999 点击Administration菜单下 ...
- Android(java)学习笔记189:ContentProvider使用(银行数据库创建和增删改查的案例)
1. Android的四大组件: (1)Activity 用户交互的UI界面 (2)Service 后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...
- 6-Java-C(移动距离)
题目描述: X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 ...
- 并发-5CAS与AQS
juc: java.util.concurrent 锁: 悲观锁:写的比较多,对数据的增删改,读(查)少.Lock 乐观锁:反之,读多写少.版本 并发编程之 CAS 的原理 什么是CAS CAS (c ...
- source collection list
1.Anaconda:http://www.cnblogs.com/xiaoming123abc/p/6970890.html https://conda.io/docs/help-support.h ...
- std::function和std::bind详解
原文:https://blog.csdn.net/xiaoyink/article/details/79348806
- HDU1401 Solitaire
题目描述:8×8的棋盘上有4个棋子,棋子的运动方法如下:1.如果其上/下/左/右一格没有棋子,则可以去;2.如果其上/下/左/右一格有棋子,而且沿原方向再跳一步没有,则可以去. 给出初始结束位置,问8 ...
- 使用枚举(emum)代替常量类
原文: 作者:逍遥不羁 来源:CSDN 原文:https://blog.csdn.net/javaloveiphone/article/details/52371706 版权声明:本文为博主原创文章, ...
- Matplotlib中的颜色
使用matplotlib中会遇到选择颜色的问题,很多人会觉得自带的matlab风格的颜色不好看.好在Matplotlib已经预见到了这个问题,除了支持最基本的matlab传统颜色之外,还支持很多种颜色 ...
- C51 keil 注意事项
下载程序需要生成hex文件 仿真 蜂鸣器 音调:频率 音量:高低电平占空比 有源:上面没有加号,只需高低电平即可发声 无源:上面有加号,不仅要电平,还要, 的频率