题目:pta堆栈操作合法性
getchar()在终端输入字符时并非输入一个字符就会返回,而是在遇到回车换行前,所有输入的字符都会缓冲在键盘缓冲器中,直到回车换行一次性将所有字符按序依次赋给相应的变量,在这里一定要注意最后一个字符即’\n’,该字符也会赋给一个相应的变量(当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以)引用地址
那么在getchar后面用gets()会将最后的\n转换成\0。
输入四组数据只判断了三组,我感觉是我对getchar()的使用不理解。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*struct dat{
char arr[101];
int top;
struct dat *next;
};
void judge(struct dat *s,int m){
int i=0;
s->top=-1;
while(s->arr[i]!='\0'){
if((s->arr[i]=='S'&&s->top==m-1)||(s->top==-1&&s->arr[i]=='X')){
printf("NO\n");
break;
}else if(s->arr[i]=='S'){
s->top++;
}else if(s->arr[i]=='X'){
s->top--;
}
if(s->top==-1&&s->arr[i+1]=='\0'){
printf("YES\n");
break;
}
i++;
}
}
struct dat *pull(int n){
struct dat *s,*head,*t;
int i;
head=(struct dat *)malloc(sizeof(struct dat));
t=head;
for(i=0;i<n;i++){
while(getchar()!='\n'){
s=(struct dat *)malloc(sizeof(struct dat));
gets(s->arr);
t->next=s;
t=s;
if(i==n-1) t->next=NULL;
}
}
return head;
}
int main(){
int n,m;
int i,j;
struct dat *head,*ns,*nt;
scanf("%d %d",&n,&m);
getchar();
head=pull(n);
nt=head;
for(j=0;j<n;j++){
ns=nt->next;
nt=ns;
judge(ns,m);
}
*/
int main(){
int i,k;
int n,m;
int top;
char arr[101];
int flag;
scanf("%d %d",&n,&m);
getchar();
for(k=0;k<n;k++){
top=-1;
flag=0;
i=0;
gets(arr);
while(arr[i]!='\0'){//原来用(arr=getchar())!='\n'来判断没做出来
if((top==-1&&arr[i]=='X')||(top==m-1&&arr[i]=='S')){
flag=1;
break;
}
if(arr[i]=='S'){
top++;
}else{
top--;
}
i++;
}
if(top==-1&&flag==0){
printf("YES\n");
}else{
printf("NO\n");
}
}
}
有更简单的办法,但是我刚开始没做出来,结果越改越难。然后看别人的,还是没做出来,明天再改。
ok,通过了,注释的是之前想复杂用链栈想写,结果没做出来,刚才就把用getchar()一个一个读改成了用gets()一次读就正确了。