栈和队列速度赛
1、括弧匹配检验(check)
【问题描述】
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])等为匹配,[(]()或(()))均为错误匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个中人包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出“OK”
【输入格式】
输入仅一行字符(字符个数小于255)
【输出格式】
匹配的就输出“OK”,不匹配的就输出“Wrong”
【输入样例】
[(])
【输出样例】
Wrong
用栈,m1记录当前栈内(的数量,m2记录当前栈内[的数量。
从左往右扫描,1、碰到(或[入栈,栈顶指针+1,m1或m2+1
2、碰到),如果m1==0,或者当前栈顶不是(,输出Wrong。否则,用这个)抵消栈顶的(,m1--,top--
3、碰到],同2
4、最后如果栈内还有元素,即top!=0,输出Wrong,否则,输出OK
#include<iostream> #include<cstdio> #include<cstring> using namespace std; string s; char stack[256]; int top,m1,m2; int main() { freopen("check.in","r",stdin); freopen("check.out","w",stdout); cin>>s; int len=s.length(); for(int i=0;i<len;i++) { if(s[i]=='(') { m1++; stack[top++]=s[i]; } if(s[i]=='[') { m2++; stack[top++]=s[i]; } else if(s[i]==')') { if(!m1) { cout<<"Wrong"; return 0; } else if(stack[top-1]!='(') { cout<<"Wrong"; return 0; } else { top--; m1--; } } else if(s[i]==']') { if(!m2) { cout<<"Wrong"; return 0; } else if(stack[top-1]!='[') { cout<<"Wrong"; return 0; } else { top--; m2--; } } } if(top||m1||m2) cout<<"Wrong"; else cout<<"OK"; }
2、最短路问题
【问题描述】
平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。
【输入格式】
输入文件为short.in,共n+m+3行其中:
第1行为整数n
第2行到第n+1行(共n行),每行两个整数x,y描述了一个点的坐标
第n+2行为一个整数m,表示输入法中连线的个数
此后m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线
最后一行:两个整数s和t,分别表示源点和目标点
【输出格式】
输出文件为short.out,仅一行,一个实数(保留两位小数),表示从s到t的最短路长度
【输入样例】
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
【输出样例】
3.41
这个题放在这儿应该用SPFA才符合队列,但我用的floyed
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int n,m; double x[101],y[101]; double d[101][101]; int s,t; double work(int a,int b) { return sqrt(pow(abs(x[a]-x[b]),2)+pow(abs(y[a]-y[b]),2)); } int main() { freopen("short.in","r",stdin); freopen("short.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=1000000; for(int i=1;i<=n;i++) d[i][i]=0; int xx,yy; scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d%d",&xx,&yy); d[xx][yy]=d[yy][xx]=work(xx,yy); } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); scanf("%d%d",&s,&t); printf("%.2lf",d[s][t]); }