实验课写了几道函数题,感觉自己函数掌握的不是很熟练。
写了一道栈的题,感觉有点儿会这个东西了。
关于栈:最经典的题就是括号匹配,遇到一个左括号就入栈,遇到一个右括号就出栈,这样正好左右匹配,这就是栈的好处。
羊羊们到了谈婚论嫁的年龄了,雷巨巨有的忙了。他有四种羊,每种羊分公母且公母才能配对,为方便输入用[]<>(){}代替四种羊,一天他让一些羊羊站成一排开始配对,有如下定义:假设s1和s2是满足配对的,则s2,{s1}s2,[s1]s2,(s1)s2也是满足配对的,如"[[(){}]<>]"和"{[(<>)]}"是满足配对的,而"<)()"和"]><["是不满足的,雷巨巨可以选择让其中一种羊变成另一种羊但无法改变其性别,如'<'可以变成'(','{','['但不可变成')','}',']'。问至少改变几次才能让羊羊们都找到幸福。
Input
输入一行字符串,仅由四种括号组成,长度不超过1e6
Output
如果不能使所有羊羊配对,则打印"Impossible",否则,打印最少替换的次数
代码如下:
#include<stdio.h>
#include<string.h>
#include<Stdlib.h>
char a[1000010];
char b[1000010];
int main()
{
int n,top=0,k=0,i,j;
scanf("%s",a);
int len = strlen(a);
for(i=0; i<len; i++)
{
if(a[i] == '[' || a[i] == '{' || a[i] == '<' || a[i] == '(') //左括号入栈
{
b[++top] = a[i];
}
else //右括号分情况讨论
{
if(top<1) //讨论空栈
{
k=-1;
break;
}
if(b[top] == '[' && a[i] == ']')
{
top--;
}
else if(b[top] == '{' && a[i] == '}')
{
top--;
}
else if(b[top] == '<' && a[i] == '>')
{
top--;
}
else if(b[top] == '(' && a[i] == ')')
{
top--;
}
else
{
top--;
k++;
}
}
}
if(top>=1)
{
k=-1;
}
if(k==-1)
{
printf("Impossible");
}
else
{
printf("%d",k);
}
return 0;
}
,写的有些晚了,今天团建愉快~