纠结了一上午,终于在最后做对了。这是第一次完全靠自己用栈写出来的代码,特别有成就感。感觉写的很简洁,完全可以做模版。嘿嘿。虽然说我对栈应用不熟练,但是最起码我会用了,哈哈。感觉纠结这一上午还是很有意义的,不断的寻找错误,不断的修改,对栈的认识也越来越熟练。这个题其实不需要用栈来做,可以用数组来做。但是既然在学栈,就要学以致用,练习一下。
解题思路:对于输入的括号进行判断,如果是“[” 或者是 " (”直接进行储存,如果是')‘或者’]‘,则进行判断一下是否与前一个括号配对。用栈对括号进行储存。最后判断栈是否为空。
原题地址:点击打开链接.
代码如下;
#include<stdio.h>
struct stack//定义栈
{
char a[10002];//储存括号
int pos;
}s;
void push(char elem)//进栈
{
s.pos++;
s.a[s.pos]=elem;
}
void pop()//类似与出栈
{
s.pos--;
}
int main()
{
int n;
char ch;
scanf("%d",&n);
getchar();//此处需要注意,吸收回车,倘若大意,后果只有一个,悲剧的WA.
while(n--)
{ s.pos=-1;
while(scanf("%c",&ch)&&ch!='\n')
{
if(ch=='['||ch=='(')//如果是左括号直接进栈
push(ch);
else
{if(ch==']'&&s.a[s.pos]=='['||s.a[s.pos]=='('&&ch==')')//此处判断与前一个括号是否配对
pop();
else
push(ch);//如果不配对,直接输入。其实更简单的是直接结束,输出No.
}
}
if(s.pos==-1)printf("Yes\n");
else printf("No\n");
}
}
另外下面是我刚开始写的错误代码,大家可以看一下,有些错误可能是共同的。嘿嘿
错误代码:
#include<stdio.h>
struct stack
{
char a[10002];
int pos;
}s;
void push(char elem)
{
s.pos++;
s.a[s.pos]=elem;
}
void pop()
{
s.pos--;printf("%d\n",s.pos);//此处输出pos,想看看到底什么地方出错
}
int main()
{
int n;
char ch;
scanf("%d",&n);
getchar();
while(n--)
{ s.pos=-1;//这个是后来测试发现的错误,要把这句话从外面移到里面来。
while(scanf("%c",&ch)&&ch!='\n')
{
if(ch=='['||ch=='(')
push(ch);
if(ch==']'&&s.a[s.pos]=='['||s.a[s.pos]=='('&&ch==')')
{pop();}
if(ch==']'&&s.a[s.pos]!='['||s.a[s.pos]!='('&&ch==')')//这地方是错误的关键,倘若是两个右括号,程序就不执行了。
push(ch);
}
if(s.pos==-1)printf("Yes\n");
else printf("No\n");
}
}
无论如何这个题用栈做了出来,嘿嘿,又向前前进了一小步。
还是那句话:路漫漫其修远兮,吾将上下而求索。