NYOJ--2题括号配对

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

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

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

代码如下;

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


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

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


发布了53 篇原创文章 · 获赞 94 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章