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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章