信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈
来源:互联网 发布:淘宝会员数量 编辑:程序博客网 时间:2024/06/06 06:29
信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈
http://ybt.ssoier.cn:8088/
//1331 【例1-2】后缀表达式的值
//该题 一本通 的在线测评,一提交就说超时,同样的题目 在洛谷
//https://www.luogu.org/problem/show?pid=1449 同样的代码,一提交就AC
//P1449 后缀表达式
//以下代码为 洛谷AC 代码,却在 一本通 超时代码
//2017-10-26 21:30
//将读取代码修改,不再超时,却报答案错误,看来有必要翻翻原书了。
//下述代码,在洛谷再次通过
//输入:
//16 9 4 3 +*-@
//输出:
//-47
#include <stdio.h>
#include <string.h>
char a[10000];
int stack[1000],top=-1;
int main(){
int k=0,i,len,b,tag,d,e,f;//此处写成 int k,i,len,b,tag,d,e,f;
char c;
gets(a);
len=strlen(a);
i=0;
while(i<len){
b=0,tag=0;
while(i<len&&'0'<=a[i]&&a[i]<='9')b*=10,b+=a[i]-'0',i++,tag=1;
if(tag)top++,stack[top]=b;
else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'){
d=stack[top],top--;
e=stack[top],top--;
switch(a[i]){
case '+':
f=e+d;
break;
case '-':
f=e-d;
break;
case '*':
f=e*d;
break;
case '/':
f=e/d;
break;
}
top++;
stack[top]=f;
i++;
}else
i++;
}
printf("%d",stack[top]);
return 0;
}
//1331 【例1-2】后缀表达式的值
//该题 一本通 的在线测评,一提交就说超时,同样的题目 在洛谷
//https://www.luogu.org/problem/show?pid=1449 同样的代码,一提交就AC
//P1449 后缀表达式
//以下代码为 洛谷AC 代码,却在 一本通 超时代码
//2017-10-26 21:30
#include <stdio.h>
#include <string.h>
char a[10000];
int stack[1000],top=-1;
int main(){
int k=0,i,len,b,tag,d,e,f;//此处写成 int k,i,len,b,tag,d,e,f;
char c;
while((c=getchar())!='@')
a[k++]=c;
a[k]='\0';
len=strlen(a);
i=0;
while(i<len){
b=0,tag=0;
while(i<len&&'0'<=a[i]&&a[i]<='9')b*=10,b+=a[i]-'0',i++,tag=1;
if(tag)top++,stack[top]=b;
else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'){
d=stack[top],top--;
e=stack[top],top--;
switch(a[i]){
case '+':
f=e+d;
break;
case '-':
f=e-d;
break;
case '*':
f=e*d;
break;
case '/':
f=e/d;
break;
}
top++;
stack[top]=f;
i++;
}else
i++;
}
printf("%d",stack[top]);
return 0;
}
//1353 表达式括号匹配(stack)
#include <stdio.h>
#include <string.h>
int stack[1000],top=-1;
char a[10000];
int main(){
int i,len;
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
if(a[i]=='(')top++,stack[top]=1;//( 1
else if(a[i]==')'){
if(top>=0)top--;
else top++,stack[top]=2;//) 2
}
if(top==-1)printf("YES");
else printf("NO");
return 0;
}
//1354 括弧匹配检验
//该题说明如下:
//题目中的字符串根本不能用,夹杂着中文的括号,英文的空格
//要进行测试,读者只能自行输入英文的符号2017-10-26 22:27
#include <stdio.h>
#include <string.h>
char a[1000];
int stack[1000],top=-1;//(1 )2 [3 ]4
int main(){
int i,len;
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
if(a[i]=='(')top++,stack[top]=1;
else if(a[i]==')'){
if(top==-1)top++,stack[top]=2;
else if(stack[top]==1)top--;
else top++,stack[top]=2;
}else if(a[i]=='[')top++,stack[top]=3;
else if(a[i]==']'){
if(top==-1)top++,stack[top]=4;
else if(stack[top]==3)top--;
else top++,stack[top]=4;
}
if(top==-1)printf("OK");
else printf("Wrong");
return 0;
}
//1355 字符串匹配问题(strs)
//一月前编写此题,一个多小时,提交,未果,搁置
//http://blog.csdn.net/ametake/article/details/43987407此文写得不错,吸引本人原因,代码写得够短
//第一步,将字符映射成数字,处理起来方便
//样例通过,提交,测试点2,3,5答案错误
//反复阅读代码,觉得所有情况都考虑周全,很需要上述三个测试点数据,无奈,在http://codevs.cn/problem/3543/提交研究
//在上述网站找到一组测试数据:
//输入:
//6
//{}{}<><>()()[][]
//{{}}{{}}<<>><<>>(())(())[{}][[]]
//{{}}{{}}<<>><<>>(())(())[[]][[]]
//{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
//><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
//([])
//输出:
//YES
//NO
//YES
//YES
//NO
//NO
//对照上述例子,发现,top未在每次读取新字符串时,初始化为0,难怪这个错误怎么找都找不到,原来是初始化的问题。
//codevs里提交AC,ybt里提交AC,2017-12-9 12:33
#include <stdio.h>
#include <string.h>
char a[]={'{','[','(','<','}',']',')','>'},s[300];//{0 }4 [1 ]5 (2 )6 <3 >7
int b[300],stack[300],top;//b[i]与s[i]一一映射
int main(){
int t,len,i,j,k,flag;//flag合法,非法标记
scanf("%d",&t);
while(t--){
flag=1,top=0;//漏了top=0这句,查了好久
scanf("%s",s);//此处写成 scanf("%d",s); 尽出昏招
len=strlen(s);
for(i=0;i<len;i++)//建立字符与数字的一一映射关系
for(j=0;j<8;j++)
if(s[i]==a[j]){
b[i]=j;
break;
}
i=0;
while(i<len){//是否匹配处理
//printf("b[%d]=%d\n",i,b[i]);
if(b[i]<=3)//b[i]元素想要入栈
if(top==0||b[i]>=stack[top]){//b[i]元素可以入栈,top==0栈为空,或栈内符号满足嵌套关系
top++,stack[top]=b[i];
}else{//b[i]元素无法入栈,该组数据非法,结束该组数据处理
flag=0;
break;
}
else if(b[i]>=4){//b[i]元素希望与栈内元素配对
if(top>0&&stack[top]+4==b[i]){//首先栈内要有元素,同时判断是否配对
top--;
}else{//无法配对,结束 该组数据处理
flag=0;
break;
}
}
i++;
}
if(top)printf("NO\n");//栈内有元素,匹配不成功
else if(flag==1)printf("YES\n");//栈内无元素,匹配成功
else printf("NO\n");//栈内无元素,匹配不成功
}
return 0;
}
//1357 车厢调度(train)
//https://www.cnblogs.com/zxqxwnngztxx/p/6679727.html代码写得精炼
//该题思维量比较大,2017-12-11 AC
#include <stdio.h>
int a[1010],b[1010],top=0;
int main(){
int n,i,cur;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);//a[i]为到达B站的车厢
b[0]=0;
for(i=1,cur=1;i<=n;i++){//模拟进栈,到达A站,出栈,到达B站,模拟
while(b[top]<a[i])top++,b[top]=cur,cur++;//比a[i]小的车厢都要在栈中 cur为需要进栈的车厢,这个要求技巧比较高
if(b[top]==a[i])top--;//将a[i]弹出栈
else{
printf("NO");
return 0;
}
}
printf("YES");
return 0;
}
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第三章 树
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第二章 队列
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第四章 图论算法
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第一章 C++语言入门
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第一章 高精度计算
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第三章 递推算法
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第三章 程序的控制结构
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第二章 顺序结构程序设计
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第五章 数 组
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第六章 函数
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第二章 数据排序
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第六章 贪心算法
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第四章 递归算法
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第七章 分治算法
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第四章 循环结构的程序设计
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第五章 搜索与回溯算法
- 位运算
- Opencv 2.4.9在Ubuntu下的配置安装
- Java中的overload和override的区别
- 初学Qt:QLineEdit设置为不可编辑
- 习题3(3.2)
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈
- linux c 预处理和结构体
- 用汇编的眼光看C++(之拷贝、赋值函数)
- linux学习之查看linux系统
- 51nod1596-二进制&输入挂-搬货物
- 如何通过 USB 设备来安装 CentOS
- Transaction
- 最基本的快速幂
- 数据库笔试题