NYOJ--2题括号配对

纠结了一上午,终于在最后做对了。这是第一次完全靠自己用栈写出来的代码,特别有成就感。感觉写的很简洁,完全可以做模版。嘿嘿。虽然说我对栈应用不熟练,但是最起码我会用了,哈哈。感觉纠结这一上午还是很有意义的,不断的寻找错误,不断的修改,对栈的认识也越来越熟练。这个题其实不需要用栈来做,可以用数组来做。但是既然在学栈,就要学以致用,练习一下。

解题思路:对于输入的括号进行判断,如果是“[” 或者是 " (”直接进行储存,如果是')‘或者’]‘,则进行判断一下是否与前一个括号配对。用栈对括号进行储存。最后判断栈是否为空。

原题地址:点击打开链接.

代码如下;

#include 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 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"); } }

无论如何这个题用栈做了出来,嘿嘿,又向前前进了一小步。

还是那句话:路漫漫其修远兮,吾将上下而求索。


你可能感兴趣的:(NYOJ--2题括号配对)