堆栈操作合法性,老师限制只能用c写

题目: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()一次读就正确了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值