鱼C论坛

 找回密码
 立即注册
查看: 1656|回复: 1

用堆栈判断是否为回文,为什么我这里结果不对,请大佬帮忙看看

[复制链接]
发表于 2022-4-25 19:45:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zyf117 于 2022-4-25 23:39 编辑

因为不会调试,所以打印了一些中间变量,查看问题,请大佬们帮忙看看是哪里出了问题,以下是代码和编译结果
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT  10

typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if( !s->base )
    {
        exit(0);
    }

    s->top = s->base;
    s->stackSize = STACK_INIT_SIZE;
}

void Push(sqStack *s, ElemType e)
{
    if( s->top - s->base >= s->stackSize )
    {
        s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        if( !s->base )
        {
            exit(0);
        }
    }

    *(s->top) = e;
    s->top++;
}

void Pop(sqStack *s, ElemType *e)
{
    if( s->top == s->base )
    {
        return;
    }
    *e = *--(s->top);
}

int StackLen(sqStack s)
{
    return (s.top - s.base);
}

void main()
{
        char a[STACK_INIT_SIZE];
        char b[STACK_INIT_SIZE];
        int i,j = 0;
        int len;
        sqStack Pal1,Pal2;
        ElemType c;

        InitStack(&Pal1);
        InitStack(&Pal2);
       
        printf("请输入一组以@结尾的回文:");
        scanf("%c", &c);
    while( c != '@' )
    {
        Push(&Pal1, c);
        scanf("%c", &c);
    }

        getchar();
       
        len = StackLen(Pal1);
    printf("栈的当前容量是: %d\n", len);
        printf("第一个栈为:");
        for( i=0; i < len; i++ )
    {
        Pop(&Pal1, &c);
        printf("%c",c);
    }
    for( i=0; i < len-1; i++ )
    {
        Pop(&Pal1, &c);
        Push(&Pal2, c);
    }

        printf("\n");
        printf("第二个栈为:");
        for( i=0; i < len; i++ )
    {
        Pop(&Pal2, &c);
        printf("%c",c);
    }
       
        printf("\n");
        for( i=0; i < len-1; i++ )
    {
        Pop(&Pal1, &c);
        a[i] = c;
    }
        printf("第一个数组为");
        for( i=0; i < len; i++ )
    {
        printf("%c ",a[i]);
    }
        printf("\n");
        for( i=0; i < len; i++ )
    {
        Pop(&Pal2, &c);
        b[i] = c;
    }
        printf("第二个数组为:");
        for( i=0; i < len; i++ )
    {
        printf("%c ",b[i]);
    }
        printf("\n");
        printf("比较数组:");
        for( i=0; i < len-1; i++ )
    {
                if(a[i] == b[i])
                {
                        j++;
                        printf("%c-%c %d  %d\n ",a[i],b[i],j,i);
                }
    }
        if(j == len)
        {
                printf("是回文");
        }
        else
        {
                printf("不是回文");
        }
}
回文判断.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-26 11:58:08 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT  10

typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
    s->base = malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if( !s->base )
    {
        exit(0);
    }

    s->top = s->base;
    s->stackSize = STACK_INIT_SIZE;
}

void Push(sqStack *s, ElemType e)
{
    if( s->top - s->base >= s->stackSize )
    {
        s->base = (ElemType *)realloc(s->base, (s->stackSize += STACKINCREMENT) * sizeof(ElemType));
        //s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        if( !s->base )
        {
            exit(0);
        }
    }

    *(s->top) = e;
    s->top++;
}

void Pop(sqStack *s, ElemType *e)
{
    if( s->top == s->base )
    {
        return;
    }
    *e = *--(s->top);
}

int StackLen(sqStack s)
{
    return (s.top - s.base);
}

void stack_deinit(sqStack *s) {
    if(s) free(s->base);
}

//void main()
int main(void)
{
    sqStack s;
    InitStack(&s);
    while(1) {
        char ch = getchar();
        if(ch == '@') break;
        Push(&s, ch);
    }
    char buff[StackLen(s)];
    size_t size = 0;
    while(StackLen(s) != 0) {
        char e; Pop(&s, &e);
        buff[size++] = e;
    }
    for(size_t i = 0; i < size; ++i) {
        Push(&s, buff[i]);
    }
    bool flag = true;
    for(size_t i = 0; i < size; ++i) {
        char e; Pop(&s, &e);
        if(e != buff[i]) {
            flag = false;
            break;
        }
    }
    printf("%s\n", flag ? "==" : "!=");
    stack_deinit(&s);
    return 0;
#if 0
        char a[STACK_INIT_SIZE];
        char b[STACK_INIT_SIZE];
        int i,j = 0;
        int len;
        sqStack Pal1,Pal2;
        ElemType c;

        InitStack(&Pal1);
        InitStack(&Pal2);
       
        printf("请输入一组以@结尾的回文:");
        scanf("%c", &c);
    while( c != '@' )
    {
        Push(&Pal1, c);
        scanf("%c", &c);
    }

        getchar();
       
        len = StackLen(Pal1);
    printf("栈的当前容量是: %d\n", len);
        printf("第一个栈为:");
        for( i=0; i < len; i++ )
    {
        Pop(&Pal1, &c);
        printf("%c",c);
    }
    for( i=0; i < len-1; i++ )
    {
        Pop(&Pal1, &c);
        Push(&Pal2, c);
    }

        printf("\n");
        printf("第二个栈为:");
        for( i=0; i < len; i++ )
    {
        Pop(&Pal2, &c);
        printf("%c",c);
    }
       
        printf("\n");
        for( i=0; i < len-1; i++ )
    {
        Pop(&Pal1, &c);
        a = c;
    }
        printf("第一个数组为");
        for( i=0; i < len; i++ )
    {
        printf("%c ",a);
    }
        printf("\n");
        for( i=0; i < len; i++ )
    {
        Pop(&Pal2, &c);
        b = c;
    }
        printf("第二个数组为:");
        for( i=0; i < len; i++ )
    {
        printf("%c ",b);
    }
        printf("\n");
        printf("比较数组:");
        for( i=0; i < len-1; i++ )
    {
                if(a == b)
                {
                        j++;
                        printf("%c-%c %d  %d\n ",a,b,j,i);
                }
    }
        if(j == len)
        {
                printf("是回文");
        }
        else
        {
                printf("不是回文");
        }
        return 0;
#endif
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表