乔治爱啃脚趾 发表于 2023-10-17 19:41:26

栈相关

1. 建立一个顺序栈或链栈

2. 实现出栈、入栈、取栈顶元素的值,判空,输出操作

3. 借助一个栈判断上述已知字符序列是否为回文,如果是,则输出“此字符序列构成回文”,否则输出“此字符序列不构成回文”。
下面是我写的代码,但是无法运行判断回文的,请各位帮我看看哪错了。谢谢!!!
#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
typedef int selemtype;
typedef struct{
        selemtype *base;
        selemtype *top;
        int stacksize;
}sqstack;
void initstack(sqstack &s)
{
        s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
        s.top=s.base;
        s.stacksize=stack_init_size;
}
void push(sqstack &s,selemtype e)//入栈
{
        if(s.top-s.base>=s.stacksize){
                s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
                if(!s.base)
                     printf("error");
                           s.top=s.base+s.stacksize;
                           s.stacksize+=stack_init_size;
        }
        *s.top=e;
        s.top++;
}
void pop(sqstack &s)//出栈
{
        selemtype *e=s.top-1;
        int i=0;
        if(s.base==s.top){
                printf("栈为空");
        }
        printf("%d ",*e);
        s.top--;
}
void gettop(sqstack &s)//取栈顶元素
{
        if(s.top!=s.base){
                   printf("\n此时栈顶元素为:");
      printf("%d\n",*s.top-1);
        }
       
}
void print(sqstack &s)//输出
{
        selemtype *e=s.base;
        int i=0;
        while(i<(s.top-s.base))
        {
                printf("%d ",*e);
                i++;
                e++;
        }
}
void judge(selemtype q)
{
        int i,flag=0,a;
        sqstack s2;
        selemtype e,f;
        initstack(s2);
        for(i=0;i<q;i++){
            scanf("%d ",&f);
            a=f;
    }
        for(i=0;i<(q-1)/2;i++){
                push(s2,a);
        }
        for(i=(q+1)/2;i<=q;i++)
        {
                if(*s2.top-1!=a)
                {
                        break;
                }
                s2.top--;
                flag=1;
        }
        if(flag==1){
                printf("是回文序列!");
        }
        else {
                printf("不是回文序列");
        }
}
int main()
{
        int n,i,m,a;
        sqstack s,s1;
        selemtype e,q,f;
        initstack(s);
        printf("请输入进栈的数量:\n");
        scanf("%d",&n);
        printf("请输入进栈的数字:\n");
        for(i=0;i<n;i++)
        {
                scanf("%d",&e);
      push(s,e);
        }
        printf("请问你想出栈几次:\n");
        scanf("%d",&m);
        for(i=0;i<m;i++){
                pop(s);
        }
    gettop(s);
    if(s.top==s.base){
            printf("栈为空。\n");
    }
    else{
            printf("栈内元素为:");
          print(s);
    }
    printf("\n请输入你想要判断是否为回文的字符序列的长度:");
    scanf("%d",&q);
    judge(q);
}

陶远航 发表于 2023-10-17 19:42:36

你的代码中存在一些问题,我已经帮你修复了。以下是修复后的代码:

#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
typedef int selemtype;
typedef struct{
    selemtype *base;
    selemtype *top;
    int stacksize;
}sqstack;

void initstack(sqstack *s) {
    s->base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
    s->top=s->base;
    s->stacksize=stack_init_size;
}

void push(sqstack *s,selemtype e) {
    if(s->top-s->base>=s->stacksize){
      s->base=(selemtype*)realloc(s->base,(s->stacksize+stackincrement)*sizeof(selemtype));
      if(!s->base) printf(\"error\");
      s->top=s->base+s->stacksize;
      s->stacksize+=stackincrement;
    }
    *s->top=e;
    s->top++;
}

void pop(sqstack *s) {
    if(s->base==s->top){
      printf(\"栈为空\");
    } else {
      s->top--;
      printf(\"%d \",*(s->top));
    }
}

void gettop(sqstack *s) {
    if(s->top!=s->base){
      printf(\"\
此时栈顶元素为:\");
      printf(\"%d\
\",*(s->top-1));
    }
}

void print(sqstack *s) {
    selemtype *e=s->base;
    while(e<s->top) {
      printf(\"%d \",*e);
      e++;
    }
}

void judge(int q) {
    int i,flag=1,a;
    sqstack s2;
    selemtype f;
    initstack(&s2);
    for(i=0;i<q;i++){
      scanf(\"%d\",&f);
      a[ i]=f;
    }
    for(i=0;i<q/2;i++){
      push(&s2,a[ i]);
    }
    for(i=(q+1)/2;i<q;i++)
    {
      if(*(s2.top-1)!=a[ i])
      {
            flag=0;
            break;
      }
      pop(&s2);
    }
    if(flag==1){
      printf(\"是回文序列!\
\");
    }
    else {
      printf(\"不是回文序列\
\");
    }
}

int main() {
    int n,i,m,q;
    sqstack s;
    selemtype e;
    initstack(&s);
    printf(\"请输入进栈的数量:\
\");
    scanf(\"%d\",&n);
    printf(\"请输入进栈的数字:\
\");
    for(i=0;i<n;i++)
    {
      scanf(\"%d\",&e);
      push(&s,e);
    }
    printf(\"请问你想出栈几次:\
\");
    scanf(\"%d\",&m);
    for(i=0;i<m;i++){
      pop(&s);
    }
    gettop(&s);
    if(s.top==s.base){
      printf(\"栈为空。\
\");
    }
    else{
      printf(\"栈内元素为:\");
      print(&s);
    }
    printf(\"\
请输入你想要判断是否为回文的字符序列的长度:\");
    scanf(\"%d\",&q);
    judge(q);
    return 0;
}


主要的修改点有:

1. 在函数参数中,你应该使用指针,而不是引用。在C语言中,没有引用的概念,所以你需要使用指针来改变结构体的值。

2. 在judge函数中,你需要在比较完一个元素后,将其从栈中弹出。

3. 在pop函数中,你需要先将栈顶指针向下移动,然后再输出元素。

4. 在realloc函数中,你应该增加的是stackincrement,而不是stack_init_size。

5. 在print函数中,你应该使用while循环,直到e<s->top,而不是使用for循环。

希望这些修改能帮助你解决问题。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-17 19:44:05

你的代码中存在几个问题:

1. 栈的初始化和入栈操作没有问题。但是在出栈操作中,你没有判断栈是否为空,如果栈为空就无法进行出栈操作。

2. 在取栈顶元素的函数中,输出的值有误。应该是*(s.top-1),而不是*s.top-1。

3. 判断回文的逻辑有误。你可以借助一个栈来判断回文。首先将前一半的字符入栈,然后遍历后一半的字符,与栈顶元素进行比较。如果相等,则继续弹出栈顶元素;如果不相等或者栈为空,则说明不是回文。

下面是修改后的代码:


#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stack_increment 10

typedef int SElemType;
typedef struct {
    SElemType* base;
    SElemType* top;
    int stacksize;
} SqStack;

void InitStack(SqStack& s) {
    s.base = (SElemType*)malloc(stack_init_size * sizeof(SElemType));
    s.top = s.base;
    s.stacksize = stack_init_size;
}

void Push(SqStack& s, SElemType e) {
    if (s.top - s.base >= s.stacksize) {
      s.base = (SElemType*)realloc(s.base, (s.stacksize + stack_increment) * sizeof(SElemType));
      if (!s.base) {
            printf("error");
            return;
      }
      s.top = s.base + s.stacksize;
      s.stacksize += stack_increment;
    }
    *(s.top) = e;
    s.top++;
}

void Pop(SqStack& s) {
    if (s.top == s.base) {
      printf("栈为空");
      return;
    }
    s.top--;
    printf("%d ", *(s.top));
}

void GetTop(SqStack& s) {
    if (s.top != s.base) {
      printf("\n此时栈顶元素为:%d\n", *(s.top - 1));
    }
}

void Print(SqStack& s) {
    SElemType* e = s.base;
    while (e < s.top) {
      printf("%d ", *e);
      e++;
    }
}

int Judge(int q) {
    int i, flag = 1, a;
    SqStack s2;
    SElemType e, f;
    InitStack(s2);
    for (i = 0; i < q; i++) {
      scanf("%d", &f);
      a = f;
    }
    for (i = 0; i < q / 2; i++) {
      Push(s2, a);
    }
    if (q % 2 == 0) {
      i = q / 2;
    } else {
      i = q / 2 + 1;
    }
    while (i < q && flag == 1) {
      if (*(s2.top - 1) != a) {
            flag = 0;
      }
      Pop(s2);
      i++;
    }
    if (flag == 1) {
      printf("是回文序列!");
    } else {
      printf("不是回文序列");
    }
    return flag;
}

int main() {
    int n, i, m, q;
    SqStack s;
    SElemType e;
    InitStack(s);
    printf("请输入进栈的数量:");
    scanf("%d", &n);
    printf("请输入进栈的数字:");
    for (i = 0; i < n; i++) {
      scanf("%d", &e);
      Push(s, e);
    }
    printf("请问你想出栈几次:");
    scanf("%d", &m);
    for (i = 0; i < m; i++) {
      Pop(s);
    }
    GetTop(s);
    if (s.top == s.base) {
      printf("栈为空。\n");
    } else {
      printf("栈内元素为:");
      Print(s);
    }
    printf("\n请输入你想要判断是否为回文的字符序列的长度:");
    scanf("%d", &q);
    Judge(q);

    return 0;
}


注意事项:
1. 在输入字符序列时,不要在每个数字后添加空格。
2. 函数Judge返回一个标志位,用于判断是否为回文。这样你可以根据需要进行处理。

希望对你有帮助!如有更多问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-10-17 19:44:21

这段代码存在几个问题:

1. 在函数 judge 中,使用了未初始化的栈 s2 ,应该在使用之前调用 initstack(s2) 进行初始化。

2. 在函数 judge 中,for循环的终止条件应该是 i<(q+1)/2 ,而不是 i<=q 。

3. 在函数 judge 中,比较栈顶元素和字符序列的元素是否相等时,应该使用 *s2.top-1 而不是 *s2.top 。

4. 在函数 judge 中,当判断为回文序列时,应该在循环结束之后设置 flag=1 ,而不是在循环内部。

5. 在函数 judge 中,判断回文序列的条件应该是 flag==0 ,而不是 flag==1 。

6. 在函数 judge 中,应该在 flag==0 的情况下输出"不是回文序列",而不是在 flag==1 的情况下输出。

7. 在函数 gettop 中,应该使用 s.top-1 而不是 s.top 来获取栈顶元素。

下面是修改后的代码:

#include <stdio.h>
#include <stdlib.h>

#define stack_init_size 100
#define stackincrement 10

typedef int selemtype;

typedef struct {
    selemtype *base;
    selemtype *top;
    int stacksize;
} sqstack;

void initstack(sqstack &s)
{
    s.base = (selemtype*)malloc(stack_init_size * sizeof(selemtype));
    s.top = s.base;
    s.stacksize = stack_init_size;
}

void push(sqstack &s, selemtype e)
{
    if (s.top - s.base >= s.stacksize) {
      s.base = (selemtype*)realloc(s.base, (s.stacksize + stack_init_size) * sizeof(selemtype));
      if (!s.base)
            printf("error");
      s.top = s.base + s.stacksize;
      s.stacksize += stack_init_size;
    }
    *s.top = e;
    s.top++;
}

void pop(sqstack &s)
{
    if (s.base == s.top) {
      printf("栈为空");
    }
    else {
      s.top--;
      printf("%d ", *s.top);
    }
}

void gettop(sqstack &s)
{
    if (s.top != s.base) {
      printf("\n此时栈顶元素为:%d\n", *(s.top - 1));
    }
}

void print(sqstack &s)
{
    selemtype *e = s.base;
    while (e < s.top) {
      printf("%d ", *e);
      e++;
    }
}

void judge(selemtype q)
{
    int i, flag = 0, a;
    sqstack s2;
    selemtype e, f;
    initstack(s2);

    for (i = 0; i < q; i++) {
      scanf("%d", &f);
      a[ i] = f;
    }

    for (i = 0; i < (q + 1) / 2; i++) {
      push(s2, a[ i]);
    }

    for (i = (q + 1) / 2; i < q; i++) {
      if (*(s2.top - 1) != a[ i]) {
            break;
      }
      s2.top--;
      flag = 1;
    }

    if (flag == 0) {
      printf("是回文序列!");
    }
    else {
      printf("不是回文序列");
    }
}

int main()
{
    int n, i, m, a;
    sqstack s, s1;
    selemtype e, q, f;
    initstack(s);

    printf("请输入进栈的数量:\n");
    scanf("%d", &n);
    printf("请输入进栈的数字:\n");
    for (i = 0; i < n; i++) {
      scanf("%d", &e);
      push(s, e);
    }

    printf("请问你想出栈几次:\n");
    scanf("%d", &m);
    for (i = 0; i < m; i++) {
      pop(s);
    }

    gettop(s);

    if (s.top == s.base) {
      printf("栈为空。\n");
    }
    else {
      printf("栈内元素为:");
      print(s);
    }

    printf("\n请输入你想要判断是否为回文的字符序列的长度:");
    scanf("%d", &q);
    judge(q);

    return 0;
}


希望这可以帮到你!如果还有其他问题,请随时提问。
页: [1]
查看完整版本: 栈相关