スタック操作の合法性、先生の制限はcで書くしかありません

8122 ワード

テーマ:ptaスタック操作の合法性
getchar()端末で文字を入力するときは1文字入力ではなく、リターン改行に遭遇する前に、すべての入力文字がキーボードバッファにバッファリングされ、リターン改行が一度にすべての文字を順番に対応する変数に順次付与するまで、ここで最後の文字である'''に注意しなければならない.この文字は、対応する変数にも割り当てられます(もちろん、入力した可視文字よりも文字を受信するために定義された変数の数が多い場合にのみ使用できます).参照アドレス
ではgetcharの後ろにgets()を使うと最後の変換が0になります.
4組のデータを入力して3組しか判断していないので、getchar()の使用が理解できないような気がします.
#include
#include
#include
/*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
"); 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
"); 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;iarr); 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;jnext; 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())!='
'
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
"
); }else{ printf("NO
"
); } } }

もっと簡単な方法がありますが、最初はできなかったので、結果は直せば直すほど難しくなりました.それから他の人のを見て、やはりできていないで、明日また直します.OK、パスしました.注釈は前に複雑にチェーンスタックで書きたいと思っていましたが、結局できませんでした.さっきgetchar()で1つ1つ読むことをgets()で1回読むことに変更しました.