彗星爱酿酒 2023-04-02 13:16 采纳率: 59.3%
浏览 58
已结题

关于堆栈操作合法性的问题

R7-1 堆栈操作合法性分数 
假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。

我的代码
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define ERROR -1
typedef enum { false, true } bool;
typedef struct SNode *PtrToSNode;
struct SNode{
    char *Data;
    int Top;
    int Max;
};
typedef PtrToSNode Stack;
Stack CreatStack(int Max);
bool Push(Stack S,char ch);
bool Pop(Stack S);
int main(void){
    int n,m,i,j;
    char ch;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++){
       Stack S=CreatStack(MAX);
        for(j=1;j<=m;j++){
            scanf("%c",ch);
            if(ch=='S'){
                 Push(S,ch);
            }else if(ch=='X'){
                Pop(S);
            }
        }
        if(S->Top==-1){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}
Stack CreatStack(int Max){
    Stack CreatStack(int Max);
    Stack S=(Stack)malloc(sizeof(struct SNode));
    S->Data=(int *)malloc(Max *sizeof(int));
    S->Top=-1;
    S->Max=Max;
    return S;
}
bool Push(Stack S,char ch){
    if(S->Top==S->Max-1){
        return false;
    }else{
        S->Data[++(S->Top)]=ch;
        return true;
    }
}
bool Pop(Stack S){
    if(S->Top==-1){
        //printf("NO\n");
        return ERROR;
    }else{
        return S->Data[(S->Top)--];
    }
}

输出总得错误,有人能帮忙看看该怎么改?实在想不出了,先谢谢了(^~^)

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-04-02 17:41
    关注

    修改如下,供参考:

    #include <stdio.h>
    #include <stdlib.h>
                       //#define MAX 100  修改
    #define ERROR 0
    #define OK    1
                       //typedef enum { false, true } bool;  修改
    typedef struct SNode *PtrToSNode;
    struct SNode{
        int *Data;    //char *Data; 修改
        int Top;
        int Max;
    };
    typedef PtrToSNode Stack;
    Stack CreatStack(int Max);
    bool Push(Stack S,char ch);
    bool Pop(Stack S);
    int main(void){
        int n,m,i,j;
        char ch;
        scanf("%d %d",&n,&m);
        getchar();             //修改
        Stack S=CreatStack(m); //修改 Stack S=CreatStack(MAX);
        for(i=1,j=0;i<=n;i++)  //修改
        {
            while ((ch = getchar()) != '\n'){ //for(j=1;j<=m;j++)
                               //scanf("%c",ch);
                if(ch == 'S'){
                    if (ERROR == Push(S,ch))
                        j = 1;      //栈满入栈
                }else if(ch == 'X'){
                    if (ERROR == Pop(S))
                        j = 1;      //栈空出栈
                }
            }
            if(S->Top == -1 && !j){ // 修改
                printf("YES\n");
            }else{
                printf("NO\n");
            }
            j = 0;                 // 复位 下一轮准备
        }
        return 0;
    }
    Stack CreatStack(int Max){
                               //Stack CreatStack(int Max);  多余
        Stack S=(Stack)malloc(sizeof(struct SNode));
        S->Data=(int *)malloc(Max *sizeof(int));
        S->Top=-1;
        S->Max=Max;
        return S;
    }
    bool Push(Stack S,char ch){
        if(S->Top==S->Max-1){
            return ERROR;
        }else{
            S->Data[++(S->Top)]=ch;
            return OK;
        }
    }
    bool Pop(Stack S){
        if(S->Top==-1){
                           //printf("NO\n");
            return ERROR;
        }else{
            S->Data[(S->Top)--];
            return  OK;   //true;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 创建了问题 4月2日

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan