糾結了一上午,終於在最後做對了。這是第一次完全靠自己用棧寫出來的代碼,特別有成就感。感覺寫的很簡潔,完全可以做模版。嘿嘿。雖然說我對棧應用不熟練,但是最起碼我會用了,哈哈。感覺糾結這一上午還是很有意義的,不斷的尋找錯誤,不斷的修改,對棧的認識也越來越熟練。這個題其實不需要用棧來做,可以用數組來做。但是既然在學棧,就要學以致用,練習一下。
解題思路:對於輸入的括號進行判斷,如果是“[” 或者是 " (”直接進行儲存,如果是')‘或者’]‘,則進行判斷一下是否與前一個括號配對。用棧對括號進行儲存。最後判斷棧是否爲空。
原題地址:點擊打開鏈接.
代碼如下;
#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");
}
}
無論如何這個題用棧做了出來,嘿嘿,又向前前進了一小步。
還是那句話:路漫漫其修遠兮,吾將上下而求索。