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

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

我的代码
#include 
#include 
#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)--];
    }
}

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

修改如下,供参考:

#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;
    }
}

else if(ch=='X'){
    Pop(S);
}


这里要对 Pop是否成功判断啊
否则明明堆栈不平衡,X很多,反复Pop
你还是判断成功

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/258351
  • 除此之外, 这篇博客: 编写程序,实现用户输入15个数据后进行排序,要求排序后按由大到小存放在一个数组中。重新输入一个数,编写查找算法找到该数是数组中的第几个元素的值,如果该数不在数组中,则输出“无此数”。中的 C语言实现:编写程序,实现用户输入15个数据后进行排序,要求排序后按由大到小存放在一个数组中。重新输入一个数,编写查找算法找到该数是数组中的第几个元素的值,如果该数不在数组中,则输出“无此数”。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 编程基础第六版 课后题

    代码如下

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    int i,j,t;
    int a[15];
    int x,l,h,mid,n;
    n=15;
    l=0;
    h=n-1;
    printf("请输入15个不同数字,按一次输入一个,依次输入15次的方法输入数字:\n");
    for(i=0;i<15;i++)
    scanf("%d",&a[i]);
    for(j=0;j<14;j++)
    {
    for(i=0;i<14-j;i++)   //这里我第一次写也忽略了j要不断的去替换i,所以对于i来说它的循环条件应该是14-j,有好多人可能和我一样写成i<15啦
    if( a[i]<a[i+1])
    {
    t=a[i];
    a[i]=a[i+1];
    a[i+1]=t;
    }
    }
    printf("按从大到小的排序结果:");
    for( i=0;i<15;i++)
    printf("%d\t",a[i]);
    printf("\n");
    
    for (l=0, h=14, printf("请输入一个数:"), scanf("%d", &x); l<=h;)//while也可以但是我很奇怪用while会提前退出循环哈哈哈
    {
    mid=(l+h)%2;
    if (x>a[mid])h=mid-1;
    else if (x<a[mid])l=mid+1;
    else
    {
    printf("%d是第%d位数",x,mid+1);
    break;
    }
    }
    if(x!=a[mid])
    printf("查无此数!");
    return 0;
    }
    

    这个是我用手机c compiler码的效果~顺便一提这个软件真的好用(✪▽✪)