m0_64743613 2022-04-10 08:49 采纳率: 100%
浏览 124
已结题

C语言数据结构栈与队列

数据结构练习:利用栈和队列的特性设计一个算法,用于判断一个字符串是否为回文,输出不对,用内存很大

// 利用栈和队列的特性设计一个算法,用于判断一个字符串是否为回文。
# include <stdio.h>
# include <stdlib.h>
# define OK 1
# define ERROR 0
typedef int Status;
typedef struct QNode{//链队列结点 
    char data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;//队尾 
}LinkQueue; 
LinkQueue Q;
Status InitQueue(LinkQueue *Q){
    Q->front = Q->rear = (QNode*)malloc(sizeof(QNode));
    Q->front->next = NULL;
    return OK;
}
Status EnQueue(LinkQueue *Q,char e){
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    p->data = e;
    p->next = NULL;
    Q->rear->next = p;
    Q->rear = p;
    return OK;
}
Status DeQueue(LinkQueue *Q,char *e){
    QueuePtr p;
    if(Q->front == Q->rear) return ERROR;
    p = Q->front->next;
    *e = p->data;
    Q->front->next = p->next;
    if(Q->rear == p)Q->rear = Q->front;
    free(p);
    return OK;
}
typedef struct{
    char *base;
    char *top;
    int stacksize;
}Sqstack;
Sqstack S;
Status InitStack(Sqstack *S){
    S->base = (char*)malloc(10*sizeof(char));
    S->top = S->base;
    S->stacksize = 10;
    return OK;
}
Status Push(Sqstack *S,char e){
    S->top++;
    *S->top = e;
    return OK;
}
Status Pop(Sqstack *S,char *e){
    if(S->top == S->base)return ERROR;
    *e = *--S->top;
    return OK;
}
Status StackEmpty(Sqstack *S){
    if(S->top==S->base){
        return 0;
    }else{
        return 1;
    }
}
int main(){
    char ch;
    char e;
    int j=0;
    InitStack(&S);
    InitQueue(&Q);
    while((ch=getchar())!='\n'){
        scanf("%c",&ch);
        Push(&S,ch);
        EnQueue(&Q,ch);
    }
    while(StackEmpty(&S)){
        char s,q;
        Pop(&S,&s);
        DeQueue(&Q,&q);
        if (s==q){
            j = 1;
        }else{
            j = 0;
            break;
        }
    }
    if(j==1){
        printf("是回文");
    }else{
        printf("不是回文");    
    }    
    return 0;
} 

输入abcba型回文以及不回文字符串时,按两次回车才输出不是回文,内存占用大,输入abccba时按一次回车输出不是回文

编译无警告,应该是哪里逻辑错了

想得到正确输出

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-04-10 12:17
    关注

    修改处见注释,供参考:

    // 利用栈和队列的特性设计一个算法,用于判断一个字符串是否为回文。
    # include <stdio.h>
    # include <stdlib.h>
    # define OK 1
    # define ERROR 0
    typedef int Status;
    typedef struct QNode{//链队列结点 
        char   data;
        struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct{
        QueuePtr front;
        QueuePtr rear;//队尾 
    }LinkQueue; 
    LinkQueue Q;
    Status InitQueue(LinkQueue *Q){
        Q->front = Q->rear = (QNode*)malloc(sizeof(QNode));
        Q->front->next = NULL;
        return OK;
    }
    Status EnQueue(LinkQueue *Q,char e){
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));
        p->data = e;
        p->next = NULL;
        Q->rear->next = p;
        Q->rear = p;
        return OK;
    }
    Status DeQueue(LinkQueue *Q,char *e){
        QueuePtr p;
        if(Q->front == Q->rear) return ERROR;
        p = Q->front->next;
        *e = p->data;
        Q->front->next = p->next;
        if(Q->rear == p)Q->rear = Q->front;
        free(p);
        return OK;
    }
    typedef struct{
        char *base;
        char *top;
        int stacksize;
    }Sqstack;
    Sqstack S;
    Status InitStack(Sqstack *S){
        S->base = (char*)malloc(10*sizeof(char));
        S->top = S->base;
        S->stacksize = 10;
        return OK;
    }
    Status Push(Sqstack *S,char e){
        //S->top++;           //修改
        *S->top++ = e;        //修改
        return OK;
    }
    Status Pop(Sqstack *S,char *e){
        if(S->top == S->base)return ERROR;
        *e = *--S->top;
        return OK;
    }
    Status StackEmpty(Sqstack *S){
        if(S->top==S->base){
            return 0;
        }else{
            return 1;
        }
    }
    int main(){
        char ch;
        char e;
        int j=0;
        InitStack(&S);
        InitQueue(&Q);
        while((ch=getchar())!='\n'){
                //scanf("%c",&ch);  修改  这句多余了
            Push(&S,ch);
            EnQueue(&Q,ch);
        }
        while(StackEmpty(&S)){
            char s,q;
            Pop(&S,&s);
            DeQueue(&Q,&q);
            if (s==q){
                j = 1;
            }else{
                j = 0;
                break;
            }
        }
        if(j==1){
            printf("是回文");
        }else{
            printf("不是回文");    
        }
        return 0;
    } 
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?